gpt4 book ai didi

c# - LINQ 比较属性值不相等的两个列表

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:30 28 4
gpt4 key购买 nike

我看过一些关于这个的 StackOverflow 文章(特别是 this)出于某种原因,我的情况有所不同。我已经使用狮子托尼的回答来尝试获取具有不同属性值的对象列表,但没有成功。然而,这确实有效:

List<Task> changedTasksWorking = new List<Task>();
for (int x = 0; x < originalTaskList.Count; x++)
{
if (originalTaskList[x].ActiveFlag != newTaskList[x].ActiveFlag)
{
changedTasksWorking.Add(newTaskList[x]);
}
}

以下是我认为会提供相同结果的内容。但是返回列表应该等于 1 的地方,它反而等于零。当我将属性比较翻转到 != 并删除内部列表上的 nor 条件时,我得到了列表的所有对象:

List<Task> notWork = oL.Where(o => newL.Any(n => o.ActiveFlag != n.ActiveFlag)).ToList();

我觉得我正在服用疯狂的药片。查看上面的单行代码,应该可以满足我的要求。也许我误解了 LINQ 方法 WhereAny 是如何交互的。

最佳答案

您提议的 LINQ 方法与您实际尝试做的似乎完全不同。特别是,根据您的原始示例,您有两个完全同步的列表。 IE。它们具有相同数量的元素,并且一个列表中的每个元素与另一个列表中相同位置的相同元素完全对应。

另一方面,您的 LINQ 代码一次查看一个列表中的每个元素,然后针对每个元素在另一个列表中搜索属性值不匹配的元素。换句话说,如果 newL 列表包含 ActiveFlag 所有可能值的元素,那么它当然会返回 oL 的所有元素,因为对于oL 中的每个元素,LINQ 都能够在 newL 中找到属性值不匹配的元素。

至少有几个使用 LINQ 的明显替代方案实际起作用:

  1. 使用 Where() 的重载将索引传递给谓词委托(delegate):
List<Task> changedTasks = newTaskList
.Where((n, i) => n.ActiveFlag != originalTaskList[i].ActiveFlag).ToList();
  1. 使用 Enumerable.Zip() 将新序列中的元素配对并过滤:
List<Task> changedTasks = originalTaskList
.Zip(newTaskList, (o, n) => o.ActiveFlag != n.ActiveFlag ? n : null)
.Where(n => n != null).ToList();

其中任何一个都应该可以正常工作。

关于c# - LINQ 比较属性值不相等的两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828392/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com