我正在寻找一种简单的方法,用另一个列表中的数据更新/插入/删除一个列表(EF)中的项目。目前我正在做这样的事情:
public UpdateSomeList(List<Foo> foos, List<Foo> foosNew)
{
//remove missing
foos.RemoveAll(x => !foosNew.Select(xx => xx.Id).Contains(x.Id));
//update existing
var updatedCount = foosNew
.Join(foos,
@new => @new.Id, old => old.Id,
(@new, old) =>
{
old.Value = @new.Value
return old;
}
)
.Count();
//insert new
var toAdd= foosNew
.Where(x => !foos.Select(xx => xx.Id).Contains(x.Id));
foos.AddRange(toAdd);
}是否有更优雅的方法来做这件事,或者我应该从我的例子中对这个用例进行扩展,就是这样吗?
发布于 2021-12-09 12:48:05
我倾向于用这样的方法:
public static void MergeWith<TItem, TKey>(
this List<TItem> destination,
IEnumerable<TItem> newItems,
Func<TItem, TKey> keySelector,
Action<TItem, TItem> update)
{
var itemsToAdd = newItems.ToDictionary(keySelector);
destination.RemoveAll(x => !itemsToAdd.ContainsKey(keySelector(x)));
foreach (TItem oldItem in destination)
{
TKey key = keySelector(oldItem);
TItem newItem = itemsToAdd[key];
itemsToAdd.Remove(key);
update(oldItem, newItem);
}
destination.AddRange(itemsToAdd.Values);
}用法:
foos.MergeWith(foosNew, x => x.Id, (oldItem, newItem) =>
{
oldItem.Value = newItem.Value;
});https://stackoverflow.com/questions/70289722
复制相似问题