web-dev-qa-db-fra.com

Comment mettre à jour un objet dans une liste <> en C #

J'ai un List<> d'objets personnalisés.

Je dois trouver un objet dans cette liste par une propriété unique et mettre à jour une autre propriété de cet objet. 

Quel est le moyen le plus rapide de le faire?

55
Burjua

Utiliser Linq pour trouver l’objet que vous pouvez faire:

var obj = myList.FirstOrDefault(x => x.MyProperty == myValue);
if (obj != null) obj.OtherProperty = newValue;

Mais dans ce cas, vous voudrez peut-être enregistrer la liste dans un dictionnaire et l'utiliser à la place:

// ... 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

Juste pour ajouter à la réponse de CKoenig. Sa réponse fonctionnera tant que la classe à laquelle vous avez affaire est un type de référence (comme une classe). Si l'objet personnalisé était une structure, il s'agit d'un type valeur et les résultats de .FirstOrDefault vous en donneront une copie locale, ce qui signifiera qu'il ne persistera pas dans la collection, comme le montre cet exemple:

struct MyStruct
{
    public int TheValue { get; set; }
}

Code de test:

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();

La sortie est 10,1,145

Modifiez la structure en une classe et la sortie est 10,12,145.

HTH

19
Matt Roberts

ou sans linq

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

Peut aussi essayer.

 _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

Vous pouvez faire quelque chose comme:

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