C# 是否有一个列表来比较两个列表中项目的属性?

C# 是否有一个列表来比较两个列表中项目的属性?,c#,list,linq,C#,List,Linq,基本上我想做以下几点: List<myClass> list1; List<myClass> list2; List<myClass> listOfDifferences; ... for (int i = 0; i < list1.Count; i++ ) { if (list1[i].myAwesomeProperty != l

基本上我想做以下几点:

        List<myClass> list1;
        List<myClass> list2;
        List<myClass> listOfDifferences;

        ...

        for (int i = 0; i < list1.Count; i++ )
        {
            if (list1[i].myAwesomeProperty != list2[i].myAwesomeProperty)
            {
                listOfDifferences.Add(list1[i]);
            }
        }
var diffs = list1.Zip(list2, (item1, item2) => (item1, item2))
    .Where(x => x.item1.myAwesomeProperty != x.item2.myAwesomeProperty)
    .Select(x => x.item1); //.ToList()
列表列表1;
清单2;
差异列表;
...
for(int i=0;i
有没有一种不使用for循环的方法?在我的例子中,我知道这两个列表是相同的,只有对象的一个属性的值可以变化。除此之外,每个列表以相同的顺序保存相同数量的对象。
据我所知,在这种情况下使用LINQ会更好,对吗?

如果保证订购,那么通过将两个列表压缩在一起,您可以执行以下操作:

        List<myClass> list1;
        List<myClass> list2;
        List<myClass> listOfDifferences;

        ...

        for (int i = 0; i < list1.Count; i++ )
        {
            if (list1[i].myAwesomeProperty != list2[i].myAwesomeProperty)
            {
                listOfDifferences.Add(list1[i]);
            }
        }
var diffs = list1.Zip(list2, (item1, item2) => (item1, item2))
    .Where(x => x.item1.myAwesomeProperty != x.item2.myAwesomeProperty)
    .Select(x => x.item1); //.ToList()
如果
ValueTuple
在您的语言级别不可用,请改用匿名对象:

var diffs = list1.Zip(list2, (item1, item2) => new{item1, item2})
    .Where(x => x.item1.myAwesomeProperty != x.item2.myAwesomeProperty)
    .Select(x => x.item1); //.ToList()

如果保证订购,则通过将两个列表压缩在一起,可以执行以下操作:

        List<myClass> list1;
        List<myClass> list2;
        List<myClass> listOfDifferences;

        ...

        for (int i = 0; i < list1.Count; i++ )
        {
            if (list1[i].myAwesomeProperty != list2[i].myAwesomeProperty)
            {
                listOfDifferences.Add(list1[i]);
            }
        }
var diffs = list1.Zip(list2, (item1, item2) => (item1, item2))
    .Where(x => x.item1.myAwesomeProperty != x.item2.myAwesomeProperty)
    .Select(x => x.item1); //.ToList()
如果
ValueTuple
在您的语言级别不可用,请改用匿名对象:

var diffs = list1.Zip(list2, (item1, item2) => new{item1, item2})
    .Where(x => x.item1.myAwesomeProperty != x.item2.myAwesomeProperty)
    .Select(x => x.item1); //.ToList()

您无法摆脱循环,但可以通过以下方式避免使用显式的
for
循环,除非您正在做一些非常愚蠢的事情,will
list1[i].myAwesomeProperty!=列表1[i].myAwesomeProperty
是否为真?AKAIK,仅当它是浮点
NaN
时,您可以使用Linq中的
Except
方法,该方法通过使用默认相等比较器比较值来生成两个序列的集差。Docs:@spender whoaps,我的坏朋友,编辑了这个问题。如果你的想法是将两个列表中的项目作为相同的索引进行比较,那么你可以只
Zip
(注意,它将在更短的列表上停止)
var diff=list1.Zip(list2,(x,y)=>new{First=x,Second=y})。其中(z=>z.First.Prop!=z.Second.Prop)。选择(z=>z.First.ToList()
您不会摆脱循环,但可以通过以下方式避免使用显式的
for
循环,除非您正在做一些非常愚蠢的事情,will
list1[i].myAwesomeProperty!=列表1[i].myAwesomeProperty
是否为真?AKAIK,仅当它是浮点
NaN
时,您可以使用Linq中的
Except
方法,该方法通过使用默认相等比较器比较值来生成两个序列的集差。Docs:@spender whoaps,我的坏朋友,编辑了这个问题。如果你的想法是将两个列表中的项目作为相同的索引进行比较,那么你可以只
Zip
(注意,它将在更短的列表上停止)
var diff=list1.Zip(list2,(x,y)=>new{First=x,Second=y})。其中(z=>z.First.Prop!=z.Second.Prop)。选择(z=>z.First.ToList()这就像一个魅力,谢谢!剩下的唯一问题是:与我在问题中使用的循环相比,此解决方案更可取/良好实践吗?@RolandDeschain在我对您原始问题的最后一次评论中讨论过,通过将解决方案重新组合为LINQ,我相信您的代码更容易验证为正确。它不需要处理迭代的机制(“如何”),而是允许您专注于要应用的特定转换(“什么”)。我很少为非变异查询编写
循环(尽管在有意义的情况下,这种偏好总是存在的)。@RolandDeschain-这个问题没有明确的答案。我更喜欢for循环,因为我发现在这种情况下它更可读,而且spender pefers LINQ。你可能会找到其他人推荐一个Paralle。对于。这个很有魅力,谢谢!剩下的唯一问题是:与我在问题中使用的循环相比,此解决方案更可取/良好实践吗?@RolandDeschain在我对您原始问题的最后一次评论中讨论过,通过将解决方案重新组合为LINQ,我相信您的代码更容易验证为正确。它不需要处理迭代的机制(“如何”),而是允许您专注于要应用的特定转换(“什么”)。我很少为非变异查询编写
循环(尽管在有意义的情况下,这种偏好总是存在的)。@RolandDeschain-这个问题没有明确的答案。我更喜欢for循环,因为我发现在这种情况下它更可读,而且spender pefers LINQ。你可能会找到另外一个人,为你推荐一个Paralle。