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

C# LINQ比较属性值不相等的两个列表,c#,linq,C#,Linq,我已经看过几篇关于这方面的文章(特别是) 由于某种原因,我的情况不同。我用Tony the Lion的答案试图得到一个具有不同属性值的对象列表,但没有成功。但是,这确实有效: List<Task> changedTasksWorking = new List<Task>(); for (int x = 0; x < originalTaskList.Count; x++) { if (originalTaskList[x].ActiveFlag != new

我已经看过几篇关于这方面的文章(特别是) 由于某种原因,我的情况不同。我用Tony the Lion的答案试图得到一个具有不同属性值的对象列表,但没有成功。但是,这确实有效:

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]);
    }
}

我觉得我在吃疯狂的药片。看看上面这一行,它应该能满足我的要求。也许我误解了LINQ方法
在哪里
任何
是如何相互作用的。

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

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

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

  • 对将索引传递给谓词委托的
    Where()
    使用重载:
  • List changedtask=newTaskList
    .Where((n,i)=>n.ActiveFlag!=originalTaskList[i].ActiveFlag).ToList();
    
  • 使用
    Enumerable.Zip()
    将元素按新顺序配对并筛选:
  • List changedtask=originalTaskList
    .Zip(newTaskList,(o,n)=>o.ActiveFlag!=n.ActiveFlag?n:null)
    .Where(n=>n!=null).ToList();
    

    这两种方法都应该很好。

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

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

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

  • 对将索引传递给谓词委托的
    Where()
    使用重载:
  • List changedtask=newTaskList
    .Where((n,i)=>n.ActiveFlag!=originalTaskList[i].ActiveFlag).ToList();
    
  • 使用
    Enumerable.Zip()
    将元素按新顺序配对并筛选:
  • List changedtask=originalTaskList
    .Zip(newTaskList,(o,n)=>o.ActiveFlag!=n.ActiveFlag?n:null)
    .Where(n=>n!=null).ToList();
    

    这两种方法都可以使用。

    什么是
    oL
    newL
    ?@Ammar它们大致相当于第一个代码示例中的originalTaskList和newTaskList。我缩短了名称,所以你们不需要滚动。什么是
    oL
    newL
    ?@Ammar它们大致相当于第一个代码示例中的originalTaskList和newTaskList。我缩短了名字,这样你们就不需要滚动了。现场-我误解了链接文章中提供的示例。非常感谢。我也很欣赏Zip示例,我以前从未使用过Zip。是的,您的参考答案适用于类似集合的操作,但不适用于检测状态的变化。这是不同的,因为你的两个序列是有序的,相互关联的,也因为你没有试图基于相等性来比较元素,而是基于属性值相对于特定对应元素的变化。很高兴上面的两个选项是有帮助的。我误解了链接文章中提供的示例。非常感谢。我也很欣赏Zip示例,我以前从未使用过Zip。是的,您的参考答案适用于类似集合的操作,但不适用于检测状态的变化。这是不同的,因为你的两个序列是有序的,相互关联的,也因为你没有试图基于相等性来比较元素,而是基于属性值相对于特定对应元素的变化。很高兴上面的两个选项很有用。
    List<Task> notWork = oL.Where(o => newL.Any(n => o.ActiveFlag != n.ActiveFlag)).ToList();