2013-03-13 13 views
5

Czy istnieje sposób, aby wykonać następujące czynności przy użyciu LINQ:Aktualizacja wszystkie obiekty z wyjątkiem jednego w kolekcji przy użyciu 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; 
    } 
} 

celu wyjaśnienia, chcę iterację każdego obiektu w kolekcji, a następnie zaktualizować obiekt na każdy obiekt z wyjątkiem jednego elementu z mojej kolekcji, który powinien zostać zaktualizowany do innej wartości.

W tym momencie używam licznika do sprawdzenia, czy ustawiam moją wartość na jeden i tylko jeden element z mojej kolekcji. Usunąłem go z tego przykładu, aby inni sugerowali inne rozwiązania.

Oryginalny pytanie bez wyjątku w kolekcji jest here

EDIT

mogę zadać to pytanie, bo nie jestem pewien, że to możliwe, aby to zrobić z LINQ. więc twoje odpowiedzi pocieszają moją opinię o LinQ. Dziękuję Ci.

+2

Czy zmieniasz swoją oryginalną kolekcję lub chcesz zwrócić kopię z tą własnością zmodyfikowaną? –

+0

Zmieniam swoją kolekcję. jaka jest różnica? –

+0

Jaki rodzaj kolekcji jest to ... Czy jest to Hashtable, Dictionary <>, List <>, etc .. please wyjaśnić, jaki rodzaj kolekcji to jest.możesz to osiągnąć używając Hashtable lub Dictionary <> czy możesz pokazać, jak zdefiniowana jest kolekcja – MethodMan

Odpowiedz

7

Można użyć .ForEach dokonać zmiany, a .Single do sprawdzenia tylko jeden element pasuje warunek:

// 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

, że odpowiedź na moje pytanie, ale prawdopodobnie nie jest najlepszym rozwiązaniem do realizacji. przeczytaj inny post, aby wybrać swój. Dziękuję Ci. –

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

Nie proponujemy, aby zaimplementować to z Linq. Czemu? Ponieważ Linq służy do sprawdzania, a nie do modyfikacji. Może zwrócić obiekty, które pasują do jakiegoś warunku lub obiekty, które nie pasują do siebie. Ale aby zaktualizować te obiekty, musisz jeszcze użyć foreach lub przekonwertować wyniki zapytania na listę i użyć rozszerzenia ForEach. Obie będą wymagać wyliczenia sekwencji dwukrotnie pod.

Więc prosta pętla będzie wykonać zadanie:

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

dobrze, można zrobić:

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; 
} 

Teraz oczywiście, że nie jest to czysty roztwór LINQ, ale czyste rozwiązania LINQ nie są odpowiednie do modyfikowania istniejących kolekcji.

2

Hacky sposobem korzystania z LINQ jeśli utrzymują używać:

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

Ale moja rada, nie rób tego, to kod faktycznie uzyskać najlepsze podejście, więcej czytelność, można zmienić:

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

To może być niebezpieczne, jeśli przejdziesz obok niezliczonej liczby mnogiej. Jeśli linia 'c.PropertyToSet ...' nie jest idempotent, "przypadkowo" iteracja więcej niż jeden raz przyniosłaby niespodziewane rezultaty. –

2

można użyć operatora potrójny w połączeniu z oświadczeniem linq:

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

Jednak użyję zwykłego foreach tutaj, aby uniknąć konwersji kolekcji na listę.

Powiązane problemy