web-dev-qa-db-ger.com

So aktualisieren Sie ein Objekt in einer Liste <> in C #

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?

55
Burjua

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;
81
Carsten

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

19
Matt Roberts

oder ohne linq

foreach(MyObject obj in myList)
{
   if(obj.prop == someValue)
   {
     obj.otherProp = newValue;
     break;
   }
}
9
Erix

Kann es auch versuchen.

 _lstProductDetail.Where(S => S.ProductID == "")
        .Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList();
4
BJ Patel
var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition());
var item = listObject.ElementAt(itemIndex);
listObject.RemoveAt(itemIndex);
item.SomePropYouWantToChange = "yourNewValue";
listObject.Insert(itemIndex, item);
2
codeMonkey

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;
}
1
Halimi