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?
Antworten:
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;
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
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);
item.SomePropYouWantToChange = "yourNewValue";
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 ...
myList.Single(x => x.MyProperty == myValue).OtherProperty = newValue;
obj
oder einen Wert (Kopie) bekommen? Mit anderen Worten, wird das Objekt in der Liste geändert?