Tengo List<>
varios objetos personalizados.
Necesito encontrar un objeto en esta lista por alguna propiedad que sea única y actualizar otra propiedad de este objeto.
¿Cuál es la forma más rápida de hacerlo?
Usando Linq para encontrar el objeto puede hacer:
var obj = myList.FirstOrDefault(x => x.MyProperty == myValue);
if (obj != null) obj.OtherProperty = newValue;
But in this case you might want to save the List into a Dictionary and use this instead:
// ... 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
or value(copy)? in other words, will be the object inside the list changed?Just to add to CKoenig's response. His answer will work as long as the class you're dealing with is a reference type (like a class). If the custom object were a struct, this is a value type, and the results of
.FirstOrDefault
will give you a local copy of that, which will mean it won't persist back to the collection, as this example shows:struct MyStruct { public int TheValue { get; set; } }
Test code:
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();
The output is 10,1,145
Change the struct to a class and the output is 10,12,145
HTH
fuente
or without linq
foreach(MyObject obj in myList) { if(obj.prop == someValue) { obj.otherProp = newValue; break; } }
fuente
Can also try.
_lstProductDetail.Where(S => S.ProductID == "") .Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList();
fuente
var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition()); var item = listObject.ElementAt(itemIndex); item.SomePropYouWantToChange = "yourNewValue";
fuente
You can do somthing like :
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; }
fuente
This was a new discovery today - after having learned the class/struct reference lesson!
You can use Linq and "Single" if you know the item will be found, because Single returns a variable...
fuente