Mam kilka List<>
niestandardowych obiektów.
Muszę znaleźć obiekt na tej liście według jakiejś unikalnej właściwości i zaktualizować inną właściwość tego obiektu.
Jak to zrobić najszybciej?
Używając Linq, aby znaleźć obiekt, który możesz zrobić:
var obj = myList.FirstOrDefault(x => x.MyProperty == myValue);
if (obj != null) obj.OtherProperty = newValue;
Ale w tym przypadku możesz zechcieć zapisać listę w słowniku i zamiast tego użyć 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;
obj
lub wartość (kopia)? innymi słowy, czy obiekt na liście zostanie zmieniony?Wystarczy dodać do odpowiedzi CKoeniga. Jego odpowiedź będzie działać, o ile klasa, z którą masz do czynienia, jest typem referencyjnym (jak klasa). Jeśli obiekt niestandardowy był strukturą, jest to typ wartości, a wyniki działania
.FirstOrDefault
da ci lokalną kopię tego, co oznacza, że nie zostanie zachowany z powrotem w kolekcji, jak pokazano w tym przykładzie:struct MyStruct { public int TheValue { get; set; } }
Kod testowy:
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();
Wynik to 10,1145
Zmień strukturę na klasę, a wynik to 10,12,145
HTH
źródło
lub bez linq
foreach(MyObject obj in myList) { if(obj.prop == someValue) { obj.otherProp = newValue; break; } }
źródło
Można też spróbować.
_lstProductDetail.Where(S => S.ProductID == "") .Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList();
źródło
var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition()); var item = listObject.ElementAt(itemIndex); item.SomePropYouWantToChange = "yourNewValue";
źródło
Możesz zrobić coś takiego:
if (product != null) { var products = Repository.Products; var indexOf = products.IndexOf(products.Find(p => p.Id == product.Id)); Repository.Products[indexOf] = product; // or Repository.Products[indexOf].prop = product.prop; }
źródło
To było dziś nowe odkrycie - po zapoznaniu się z lekcją referencyjną dotyczącą klasy / struktury!
Możesz użyć Linq i „Single”, jeśli wiesz, że element zostanie znaleziony, ponieważ Single zwraca zmienną ...
źródło