您的实际查询只是获取满足条件的第一个项目。LINQ 用于查询而不是修改集合,因此您不应该将项目作为查询的一部分添加到集合中;将其作为处理查询的一部分。
var match = list.FirstOrDefault(x => x.Name == "some name");
if(match != null)
match.Value = "something else";
else
list.Add(new MyObject(){...});
如果您想要一种更通用的GetOrAdd
方法,您也可以制作一个:
public static T GetOrAdd<T>(this IList<T> list, Func<T, bool> predicate,
Func<T> constructor)
{
var match = list.FirstOrDefault(predicate);
if(match == null)
{
match = constructor();
list.Add(match);
}
return match;
}
使用它,您可以编写如下内容:
var item = list.GetOrAdd(obj => obj.Name == "Some Name", () => new MyObj(){...});
item.Value = "Some Value";
完成此操作后,请强烈考虑Dictionary
对这个集合使用 a 而不是 a List
of pair,因为它可以根据键更有效地搜索。
如果您确实有,Dictionary
那么执行此操作的代码将非常简单:
dictionary["some name"] = "some value";
除了代码更短之外,它的执行速度也将大大加快。