Ich habe einen List<>
von benutzerdefinierten Objekten.
Ich muss ein Objekt in dieser Liste anhand einer eindeutigen Eigenschaft finden und eine andere Eigenschaft dieses Objekts aktualisieren.
Wie geht es am schnellsten?
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 sollten Sie die Liste jedoch 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;
Nur um CKoenigs Antwort hinzuzufügen. Seine Antwort wird funktionieren, solange die Klasse, mit der Sie es zu tun haben, ein Referenztyp ist (wie eine Klasse). Wenn das benutzerdefinierte Objekt eine Struktur war, handelt es sich um einen Wertetyp, und die Ergebnisse von .FirstOrDefault
geben Ihnen eine lokale Kopie davon. Dies bedeutet, dass es nicht in der Auflistung verbleibt.
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 beträgt 10,1.145
Ändern Sie die Struktur in eine Klasse. Die Ausgabe lautet 10,12,145
HTH
oder ohne linq
foreach(MyObject obj in myList)
{
if(obj.prop == someValue)
{
obj.otherProp = newValue;
break;
}
}
Kann es auch versuchen.
_lstProductDetail.Where(S => S.ProductID == "")
.Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList();
var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition());
var item = listObject.ElementAt(itemIndex);
listObject.RemoveAt(itemIndex);
item.SomePropYouWantToChange = "yourNewValue";
listObject.Insert(itemIndex, item);
Sie können so etwas tun:
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;
}