2011-08-25 9 views

Odpowiedz

60

użyciu LINQ aby znaleźć obiekt można zrobić:

var obj = myList.FirstOrDefault(x => x.MyProperty == myValue); 
if (obj != null) obj.OtherProperty = newValue; 

Ale w tym przypadku może chcesz zapisać listę do słownika i używać zamiast tego:

// ... define after getting the List/Enumerable/whatever 
var dict = myList.ToDictionary(x => x.MyProperty); 
// ... somewhere in code 
MyObject found; 
if (dict.TryGetValue(myValue, out found)) found.OtherProperty = newValue; 
+3

Dzięki CKoenig będzie to uzyskać odwołanie do 'obj' lub wartości (kopia)? innymi słowy, czy zmieni się obiekt wewnątrz listy? – Burjua

+4

Myślę, że to by nie działało, jeśli obiekt jest typu struct, uczyń go klasą :) –

+12

Ponieważ masz listę niestandardowych obiektów (zakładając, że jest to klasa, a nie struktura), masz do czynienia z typem referencyjnym , będzie to odniesienie do tego obiektu, a modyfikacja będzie "trwała" - zmodyfikuje obiekt w kolekcji. –

8

lub bez LINQ

+0

Tak, to jest oczywista odpowiedź, ale Nie chcę używać foreach, domyślam się, że to najwolniejszy sposób na zrobienie tego. – Burjua

+0

Czy ktoś może skomentować, czy powyższa metoda LINQ jest rzeczywiście bardziej wydajna niż ta? – pseudocoder

+3

W przypadku jakichkolwiek różnic wersja linq jest prawdopodobnie wolniejsza. – Erix

13

Wystarczy dodać do odpowiedzi CKoeniga. Jego odpowiedź będzie działać tak długo, jak klasa, z którą masz do czynienia, jest typem odniesienia (jak klasa). Jeśli obiekt niestandardowy był strukturą, jest to typ wartości, a wyniki .FirstOrDefault dadzą lokalną kopię tego, co będzie oznaczać, że nie będzie się utrzymywał z powrotem w kolekcji, ponieważ ten przykład pokazuje:

struct MyStruct 
{ 
    public int TheValue { get; set; } 
} 
Kod

test:

List<MyStruct> coll = new List<MyStruct> { 
              new MyStruct {TheValue = 10}, 
              new MyStruct {TheValue = 1}, 
              new MyStruct {TheValue = 145}, 
              }; 
var found = coll.FirstOrDefault(c => c.TheValue == 1); 
found.TheValue = 12; 

foreach (var myStruct in coll) 
{ 
    Console.WriteLine(myStruct.TheValue); 
} 
Console.ReadLine(); 

wyjście jest 10,1,145

Zmiana struct do klasy i wyjście jest 10,12,145

HTH

+0

ok - dziękuję. Domyślam się, że otrzymałeś odniesienie do struktury, a nie lokalnej kopii. – Carsten

+1

Używałem struct, klasa rozwiązała to. Dzięki. – teapeng

3

Można również spróbować.

_lstProductDetail.Where(S => S.ProductID == "") 
     .Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList(); 
+0

Działa to z listą lub tablicą, ale nie można jej obliczyć – R2D2

0
var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition()); 
var item = listObject.ElementAt(itemIndex); 
listObject.RemoveAt(itemIndex); 
item.SomePropYouWantToChange = "yourNewValue"; 
listObject.Insert(itemIndex, item); 
Powiązane problemy