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?
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;
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
ou sans linq
foreach(MyObject obj in myList)
{
if(obj.prop == someValue)
{
obj.otherProp = newValue;
break;
}
}
Peut aussi essayer.
_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);
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;
}