Ich habe ein List<>
benutzerdefiniertes Objekt.
Ich muss ein Objekt in dieser Liste anhand einer Eigenschaft finden, die eindeutig ist, und eine andere Eigenschaft dieses Objekts aktualisieren.
Was ist der schnellste Weg, dies zu tun?
Verwenden Sie Linq, um das Objekt zu finden, das Sie tun können:
var obj = myList.FirstOrDefault(x => x.MyProperty == myValue);
if (obj != null) obj.OtherProperty = newValue;
In diesem Fall möchten Sie die Liste möglicherweise in einem Wörterbuch speichern und stattdessen Folgendes verwenden:
// ... 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
oder einen Wert (Kopie) bekommen? Mit anderen Worten, wird das Objekt in der Liste geändert?Nur um CKoenigs Antwort zu ergänzen. Seine Antwort funktioniert, solange die Klasse, mit der Sie sich befassen, ein Referenztyp ist (wie eine Klasse). Wenn das benutzerdefinierte Objekt eine Struktur wäre, ist dies ein Werttyp, und die Ergebnisse von
.FirstOrDefault
geben Ihnen eine lokale Kopie davon, was bedeutet, dass es nicht in der Auflistung verbleibt, wie dieses Beispiel zeigt:struct MyStruct { public int TheValue { get; set; } }
Testcode:
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();
Die Ausgabe ist 10,1,145
Ändern Sie die Struktur in eine Klasse und die Ausgabe ist 10,12,145
HTH
quelle
oder ohne linq
foreach(MyObject obj in myList) { if(obj.prop == someValue) { obj.otherProp = newValue; break; } }
quelle
Kann es auch versuchen.
_lstProductDetail.Where(S => S.ProductID == "") .Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList();
quelle
var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition()); var item = listObject.ElementAt(itemIndex); item.SomePropYouWantToChange = "yourNewValue";
quelle
Sie können etwas tun wie:
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; }
quelle
Dies war heute eine neue Entdeckung - nachdem ich die Klassen- / Strukturreferenz gelernt hatte!
Sie können Linq und "Single" verwenden, wenn Sie wissen, dass das Element gefunden wird, da Single eine Variable zurückgibt ...
quelle