2010-05-26 6 views
8

Ich bin neu bei Lambda-Ausdrücken und möchte die Syntax nutzen, um den Wert einer Eigenschaft in einer Auflistung festzulegen bezogen auf einen anderen Wert in einer SammlungLambda-Ausdrücke - legen Sie den Wert einer Eigenschaft in einer Auflistung von Objekten basierend auf dem Wert einer anderen Eigenschaft in der Auflistung fest

Typischerweise würde ich um eine Schleife tun:

class Item 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

void Run() 
{ 
    Item item1 = new Item { Name = "name1" }; 
    Item item2 = new Item { Name = "name2" }; 
    Item item3 = new Item { Name = "name3" }; 

    Collection<Item> items = new Collection<Item>() { item1, item2, item3 }; 

    // This is what I want to simplify. 
    for (int i = 0; i < items.Count; i++) 
    { 
     if (items[i].Name == "name2") 
     { 
      // Set the value. 
      items[i].Value = "value2"; 
     } 
    } 
} 

Antwort

14

LINQ Daten für die Auswahl als Daten zum Modifizieren der Regel mehr nützlich ist. Aber Sie so etwas schreiben könnte:

foreach(var item in items.Where(it => it.Name == "name2")) 
    item.Value = "value2"; 

Dieser erste Artikel auswählt, die modifiziert und dann werden müssen modifiziert alle eine Standard zwingend notwendig Schleife. Sie können die foreach Schleife mit ForAll Methode ersetzen, die für Listen zur Verfügung, aber ich glaube nicht, das gibt Ihnen einen Vorteil:

items.Where(it => it.Name == "name2").ToList() 
    .ForEach(it => it.Value = "value2"); 

Beachten Sie, dass Sie benötigen ToList in der Mitte hinzufügen, weil ForEach ein .NET 2.0 Feature, das nur für List<T> Typ verfügbar ist - nicht für alle IEnumerable<T> Typen (wie andere LINQ-Methoden). Wenn Sie diesen Ansatz möchten, können Sie ForEach für IEnuerable<T> implementieren:

public static void ForEach<T>(this IEnumerable<T> en, Action<T> f) { 
    foreach(var a in en) f(a); 
} 

// Then you can omit the `ToList` conversion in the middle 
items.Where(it => it.Name == "name2") 
    .ForEach(it => it.Value = "value2"); 

Wie dem auch sei, ich würde foreach Schleife bevorzugen, denn das macht auch deutlich, dass Sie einige Mutation tun - und es ist nützlich, das zu sehen Tatsache leicht im Code.

+0

Geringfügige Korrektur: Das soll es sein. Value = "value2" ... –

+0

schön. Kein Weg um die Schleife dann? –

+0

@Michael Rut, liest die Schleife besser als die ForEach-Methode, aber das ist eine Frage der Meinung. Ich stimme dem zu, was Tomas in seiner Antwort über die Klarheit der Aktion gesagt hat. Er hat jedoch einen Weg gezeigt, wie Sie die Schleife abstrahieren können (obwohl klar ist, dass eine Schleife immer noch passieren wird, anstatt sie explizit zu programmieren oder nicht). –

Verwandte Themen