要检查两个列表的差异,我应该使用 LINQ 还是 ForEach? [已关闭]

问题描述 投票:0回答:2

我足够坚定地认为我理解了原始OP的根本问题。这是我编辑的解释。如果我越界,就开枪打我;)

我显示了一组对象。操作员可以编辑该集合。他可以添加元素,可以删除元素,也可以更改元素。编辑完成后,操作员按下按钮,表示编辑完成。

我的程序需要处理编辑后的列表。 为此,我有原始的元素序列和编辑后的元素序列。我的程序需要找出哪些元素被删除、哪些被添加、哪些被更改。

所以我有这样的东西:

class Element {...}

IEnumerable<Element> originalElements = ...
IEnumerable<Element> editedElements = ...

我需要制作三个序列:

IEnumerable<Element> addedElements = ...
IEnumerable<Element> removedElements = ...
IEnumerable<Element> changedElements = ...

为此,我可以使用 LINQ,可能是带有 except 的东西。我还可以枚举序列来创建所需的集合。

问题:哪种方法更好?

由于缺乏信息而关闭的原始问题:

requestList = ["elem1", "elem2", "elem3"];
existList = ["elem1", "elem4", "elem5"];

需要这样

needToAddList = ["elem2", "elem3"];
needToRemoveList = ["elem4", "elem5"];
noChanges = ["elem1"];

Foreach 循环或 LINQ (除了 & intersect) 哪种过滤器最适合这种类型?

c# .net list linq foreach
2个回答
1
投票

为什么不使用 List<>.Where()、List<>.AddRange() 和 Array.ToList() 将过滤后的项目添加到其他列表

noChange.AddRange(requestList.Where(item => existList.Contains(item)).ToList());
needToAddList.AddRange(requestList.Where(item => existList.Contains(item)).ToList());
needToRemoveList.AddRange(existList.Where(item => !requestList.Contains(item)).ToList());

确保再次执行此操作时清除列表(例如在函数中使用它时)

    List<string> requestList = ["elem1", "elem2", "elem3"];
    List<string> existList = ["elem1", "elem4", "elem5"];

    List<string> noChange = new List<string>();
    List<string> needToAddList = new List<string>();
    List<string> needToRemoveList = new List<string>();

    private void FilterLists()
    {
        noChange.Clear();
        needToAddList.Clear();
        needToRemoveList.Clear();
        noChange.AddRange(requestList.Where(item => existList.Contains(item)).ToList());
        needToAddList.AddRange(requestList.Where(item => !existList.Contains(item)).ToList());
        needToRemoveList.AddRange(existList.Where(item => !requestList.Contains(item)).ToList());
    }

编辑: 使用 Intersect 和 except 你可以使用几乎相同的基础

noChange.AddRange(existList.Intersect(requestList).ToList());
needToAddList.AddRange(requestList.Except(existList).ToList());
needToRemoveList.AddRange(existList.Except(requestList).ToList());

或者使用 string[] 也许,我对大量列表和这些列表的性能没有那么丰富的经验......

string[] noChange = existList.Intersect(requestList).ToArray()
string[] needToAddList = requestList.Except(existList).ToArray()
string[] needToRemoveList = existList.Except(requestList).ToArray()

-1
投票

您可以使用 LINQ 输出项目集合,其中每个列表都具有相同的项目:

string[] noChanges = needToAddList
    .Where(a1 => needToRemoveList
        .Any(a2 => a1.Contains(a2))
    )
.ToArray();
© www.soinside.com 2019 - 2024. All rights reserved.