我足够坚定地认为我理解了原始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) 哪种过滤器最适合这种类型?
为什么不使用 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()
您可以使用 LINQ 输出项目集合,其中每个列表都具有相同的项目:
string[] noChanges = needToAddList
.Where(a1 => needToRemoveList
.Any(a2 => a1.Contains(a2))
)
.ToArray();