it-swarm.com.ru

Как обновить объект в списке <> в C #

У меня есть List<> пользовательских объектов.

Мне нужно найти объект в этом списке по какому-либо уникальному свойству и обновить другое свойство этого объекта. 

Какой самый быстрый способ сделать это?

55
Burjua

Используя Linq, чтобы найти объект, который вы можете сделать:

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

Но в этом случае вы можете сохранить список в словарь и использовать вместо этого:

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

Просто чтобы добавить к ответу Кенига. Его ответ будет работать до тех пор, пока класс, с которым вы имеете дело, является ссылочным типом (например, класс). Если пользовательский объект был структурой, это тип значения, и результаты .FirstOrDefault предоставят вам локальную копию этого, что будет означать, что он не будет сохранен обратно в коллекцию, как показано в следующем примере:

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

Тестовый код:

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

Результат 10,1455

Измените структуру на класс, и результат будет 10,12,145

НТН

19
Matt Roberts

или без linq

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

Можно и попробовать.

 _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

Вы можете сделать что-то вроде:

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