2013-03-13 4 views
5

Gibt es eine Möglichkeit, das folgende mit Linq zu tun:Aktualisieren Sie alle Objekte mit einer Ausnahme in einer Sammlung mit Linq

foreach (var c in collection) 
{ 
    if (c.Condition == condition) 
    { 
     c.PropertyToSet = value; 
     // I must also check I only set this value to one minimum and only one element. 
    } 
    else 
    { 
     c.PropertyToSet = otherValue; 
    } 
} 

Um zu klären, ich möchte in einer Sammlung durch jedes Objekt iterieren und dann eine Eigenschaft aktualisieren auf Jedes Objekt außer einem Element meiner Sammlung, das auf einen anderen Wert aktualisiert werden sollte.

In diesem Moment verwende ich einen Zähler, um zu überprüfen, dass ich meinen Wert auf ein einziges Element meiner Sammlung setze. Ich habe es aus diesem Beispiel entfernt, damit die Leute andere Lösungen vorschlagen können.

Die ursprüngliche Frage ohne Ausnahme in der Sammlung ist here

EDIT

ich diese Frage stellen, weil ich es bin nicht sicher möglich, es mit LinQ zu tun. Deine Antworten beruhigen meine Meinung zu LinQ. Vielen Dank.

+2

Sind Sie _changing_ Ihre ursprüngliche Sammlung oder möchten Sie eine Kopie mit dieser geänderten Eigenschaft zurückgeben? –

+0

Ich ändere meine Sammlung. Was ist der Unterschied? –

+0

Welche Art von Sammlung ist das .. Ist dies eine Hashtable, Dictionary <>, List <>, etc..Please klären, welche Art von Sammlung das ist.Sie können dies mithilfe einer Hashtable oder eines Dictionary erreichen. <> können Sie zeigen, wie die Collection definiert ist. – MethodMan

Antwort

7

Sie können .ForEach verwenden, um die Änderung vorzunehmen, und .Single nur ein Element, um zu überprüfen entspricht den Zustand:

// make sure only one item matches the condition 
var singleOne = collection.Single(c => c.Condition == condition); 
singleOne.PropertyToSet = value; 

// update the rest of the items 
var theRest = collection.Where(c => c.Condition != condition); 
theRest.ToList().ForEach(c => c.PropertyToSet = otherValue); 
+0

, dass die Antwort auf meine Frage aber wahrscheinlich nicht die beste Lösung zu implementieren ist. Lesen Sie einen anderen Beitrag, um Ihren zu wählen. Vielen Dank. –

2
collection.Where(x => <condition>).ToList().ForEach(x => <action>); 
5

Ich schlage vor, Sie nicht dieses mit Linq zu implementieren. Warum? Weil Linq zur Abfrage dient, nicht zur Modifikation. Sie können Objekte zurückgeben, die bestimmten Bedingungen entsprechen, oder Objekte, die nicht übereinstimmen. Für die Aktualisierung dieser Objekte müssen Sie jedoch foreach verwenden oder die Abfrageergebnisse in eine Liste konvertieren und die Erweiterung ForEach verwenden. Beide erfordern die Aufzählungssequenz zweimal.

So einfache Schleife wird die Arbeit machen:

foreach (var c in collection) 
{ 
    c.PropertyToSet = (c.Condition == condition) ? value : otherValue; 
} 
0

Nun, könnten Sie tun:

var itemToSetValue = collection.FirstOrDefault(c => c.Condition == condition); 

if(itemToSetValue != null) 
    itemToSetValue.PropertyToSet = value; 

// Depending on what you mean, this predicate 
// might be c => c != itemToSetValue instead. 
foreach (var otherItem in collection.Where(c => c.Condition != condition)) 
{ 
    otherItem.PropertyToSet = otherValue; 
} 

Jetzt natürlich, dass keine reine LINQ Lösung ist, sondern reine LINQ Lösungen sind nicht geeignet um vorhandene Sammlungen zu ändern.

2

Hacky Weg LINQ zu verwenden, wenn Sie anhalten zu verwenden:

var result = collection.Select(c => 
{ 
    c.PropertyToSet = c.Condition == condition ? value : otherValue; 
    return c; 
}); 

Aber meine Empfehlung, dies nicht tun, können Sie Code tatsächlich den besten Ansatz erhalten, für mehr Lesbarkeit, können Sie ändern:

foreach (var c in collection) 
    c.PropertyToSet = c.Condition == condition ? value : otherValue; 
+0

Es ist möglicherweise gefährlich, wenn Sie den nicht nummerierten IEnumerable weitergeben. Wenn die Zeile "c.PropertyToSet ..." nicht idempotent ist, würde "versehentliches" mehrmaliges Iterieren zu unerwarteten Ergebnissen führen. –

2

Sie können einen ternären Operator in Verbindung mit einer Linq-Anweisung verwenden:

collection.ToList().ForEach(c => c.PropertyToSet = c.Condition == condition ? value : otherValue); 

Allerdings würde ich hier nur eine normale foreach verwenden, um die Sammlung in eine Liste zu konvertieren.

Verwandte Themen