首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从其他列表.NET6更新列表

从其他列表.NET6更新列表
EN

Stack Overflow用户
提问于 2021-12-09 12:11:46
回答 1查看 125关注 0票数 0

我正在寻找一种简单的方法,用另一个列表中的数据更新/插入/删除一个列表(EF)中的项目。目前我正在做这样的事情:

代码语言:javascript
运行
复制
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);
}

是否有更优雅的方法来做这件事,或者我应该从我的例子中对这个用例进行扩展,就是这样吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-09 12:48:05

我倾向于用这样的方法:

代码语言:javascript
运行
复制
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);
}

用法:

代码语言:javascript
运行
复制
foos.MergeWith(foosNew, x => x.Id, (oldItem, newItem) =>
{
    oldItem.Value = newItem.Value;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70289722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档