LINQ比较两个列表,其中属性值不相等

时间:2019-06-30 22:08:39

标签: c# linq

我已经阅读了几篇关于此的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的地方,它等于0。当我将属性比较翻转到!=并删除内部列表的nor条件时,我得到列表的所有对象:

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

我觉得我正在服用疯狂药丸。看看上面的一线,应该可以满足我的要求。也许我误解了LINQ方法WhereAny是如何相互作用的。

1 个答案:

答案 0 :(得分:4)

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

另一方面,您的LINQ代码一次查看一个列表中的每个元素,对于这些元素中的每个,在另一个列表中搜索属性值不匹配的元素。换句话说,如果<div class="section01"> <div class="numb"> 01 </div> <!-- /.numb --> <div class="numbdescr"> Юридические услуги </div> <!-- /.numbdescr --> </div>列表中包含newL所有可能值的元素,那么它当然会返回ActiveFlag的所有元素,因为对于oL中的每个元素, LINQ能够在oL中找到属性值不匹配的元素。

至少有几个使用LINQ的显而易见的替代方法,它们将有效

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

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