您的實際查詢只是獲取符合條件的第一個項目。 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
這個集合而不是List
對,因爲它可以更有效地搜索基於鍵。
如果你確實有一個Dictionary
然後代碼來執行這將是簡單的:
dictionary["some name"] = "some value";
而且除了是在更短的代碼,它會執行大幅更快。
使用字典? –
我猜你缺少代碼中的myList.Add() - myList.Where(x => x.Name =='some name')。DefaultIfEmpty((=)=> {myList.Add(new myobj( ){Name ='some name')。First()。Value ='some value'})};); – Jegan