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

Iof*_*ure 2 c# linq

我已经阅读了几篇有关此问题的 StackOverflow 文章(尤其是这篇文章),由于某种原因,我的情况有所不同。我使用托尼狮子的答案来尝试获取具有不同属性值的对象列表,但没有成功。然而,这确实有效:

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我认为会给我带来相同结果的内容。但是,当返回的列表应等于 1 时,它却等于 0。当我翻转属性比较!=并删除内部列表上的 Nor 条件时,我得到了列表中的所有对象:

List<Task> notWork = oL.Where(o => newL.Any(n => o.ActiveFlag != n.ActiveFlag)).ToList();
Run Code Online (Sandbox Code Playgroud)

我感觉我正在服用疯狂的药片。看看上面的一句话应该可以满足我的要求。也许我误解了 LINQ 方法WhereAny是如何交互的。

Pet*_*iho 5

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

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

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

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

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