it-swarm.com.de

So aktualisieren Sie ein Element mit einer Liste mithilfe von LINQ und C #

Ich habe eine Liste von Objekten, und ich möchte eine bestimmte Mitgliedervariable in einem der Objekte aktualisieren. Ich verstehe, dass LINQ für die Abfrage gedacht ist und nicht dazu gedacht ist, Listen unveränderlicher Daten zu aktualisieren. Was wäre der beste Weg, um dies zu erreichen? Ich muss LINQ nicht für die Lösung verwenden, wenn diese nicht besonders effizient ist. 

Würde das Erstellen einer Update-Erweiterungsmethode funktionieren? Wenn ja, wie würde ich das tun?

EXAMPLE:
(from trade in CrudeBalancedList
 where trade.Date.Month == monthIndex
 select trade).Update(
 trade => trade.Buy += optionQty);
13
Addie

Obwohl linq nicht dazu gedacht ist, Listen von unveränderlichen Daten zu aktualisieren, ist es sehr praktisch, um die Elemente zu erhalten, die Sie aktualisieren möchten. Ich denke für Sie wäre das:

(from trade in CrudeBalancedList
    where trade.Date.Month == monthIndex
    select trade).ToList().ForEach( trade => trade.Buy += optionQty);
30
Patrick Karcher

Ich bin nicht sicher, ob dies der beste Weg ist, aber Sie können ein Element aus der Liste aktualisieren.

Das Testobjekt:

 public class SomeClass {
        public int Value { get; set; }
        public DateTime Date { get; set; }
    }

Die Erweiterungsmethode:

public static class Extension {
        public static void Update<T>(this T item, Action<T> updateAction) {
            updateAction(item);
        }
    }

Der Test:

public void Test()
{
    // test data
    List<SomeClass> list = new List<SomeClass>()
    {
        new SomeClass {Value = 1, Date = DateTime.Now.AddDays(-1)},
        new SomeClass {Value = 2, Date = DateTime.Now },
        new SomeClass {Value = 3, Date = DateTime.Now.AddDays(1)}
    };
    // query and update
    (from i in list where i.Date.Day.Equals(DateTime.Now.Day) select i).First().Update(v => v.Value += 5);

    foreach (SomeClass s in list) {
        Console.WriteLine(s.Value);
    }
}
4
Fernando

Sie erwarten hier also ein einziges Ergebnis. In diesem Fall können Sie die SingleOrDefault-Methode in Betracht ziehen:

var record =
    (from trade in CrudeBalancedList
    where trade.Date.Month == monthIndex
    select trade).SingleOrDefault();

if (record != null)
    record.Buy += optionQty;

Beachten Sie, dass die SingleOrDefault-Methode erwartet, dass genau ein oder Null - Wert zurückgegeben wird (ähnlich einer Zeile in einer Tabelle für einen eindeutigen Primärschlüssel). Wenn mehr als ein Datensatz zurückgegeben wird, löst die Methode eine Ausnahme aus.

1
Dan Tao

Um eine solche Methode zu erstellen, würden Sie mit ihrem Prototyp beginnen:

public static class UpdateEx {
    public void Update(this IEnumerable<T> items, 
                       Expression<Action> updateAction) {
    }
}

Das ist der leichte Teil.

Der schwierige Teil wird darin bestehen, compile the Expression<Action> in eine SQL-Aktualisierungsanweisung zu konvertieren. Abhängig davon, wie viel Syntax Sie unterstützen möchten, kann die Komplexität eines solchen Compilers von trivial bis unmöglich reichen.

Ein Beispiel zum Kompilieren von Linq-Ausdrücken finden Sie in der TableQuery-Klasse des sqlite-net-Projekts .

0
Frank Krueger