繁体   English   中英

从其他列表 .NET6 更新列表

[英]Update List from other list .NET6

我正在寻找一种简单的方法来使用另一个列表中的数据更新/插入/删除一个列表 (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);
}

有没有更优雅的方法可以做到这一点,或者我应该从我的例子中为这个用例做一个扩展,就是这样?

我倾向于使用这样的东西:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM