通过指定的方法C#比较两个自定义对象列表

时间:2016-07-15 16:09:05

标签: c# linq

我之前曾经问过同名的问题,但这是我的理由:

我想比较两个自定义对象列表,这些自定义对象不会覆盖Equals,也不会实现IEqualityComparer,但我想将它们与静态比较方法进行比较,如:

public class Custom
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

public static bool Compare(Custom A, Custom B)
{
    return A.Prop1 == B.Prop1 && A.Prop2 == B.Prop2;
}

假设列表的元素顺序相同:

List<Custom> l1 = new List<Custom> {new Custom { Prop1 = "A", Prop2 = "B"}, new Custom { Prop1 = "A", Prop2 = "B" } };
List<Custom> l2 = new List<Custom> { new Custom { Prop1 = "A", Prop2 = "B" }, new Custom { Prop1 = "A", Prop2 = "b" } };

我试图避免像这样:

if(l1.Count != l2.Count)return;
for (int i = 0; i < l1.Count; i++)
{
    if(!Compare(l1[i], l2[i]))return;
}
bool comparisonResult = true;

使用linq,但我想我错过了一些东西:

bool comparisonResult = l1.Any(x => l2.Any(y => Compare(x, y)));

这是尝试过的,但是当列表不相同时,它会一直返回true

2 个答案:

答案 0 :(得分:3)

如果您必须使用LINQ并且不想为IEqualityComparer实施Custom ...

假设这两个列表的顺序正确,您可以使用Zip创建一个并排的每个项目的新列表,类似于Tuple。然后,您可以在新列表上调用All来调用静态Compare方法:

  List<Custom> l1 = new List<Custom> {new Custom { Prop1 = "A", Prop2 = "B"}, new Custom { Prop1 = "A", Prop2 = "B" } };
  List<Custom> l2 = new List<Custom> { new Custom { Prop1 = "A", Prop2 = "B" }, new Custom { Prop1 = "A", Prop2 = "b" } };

  bool comparisonResult = l1.Zip(l2, (x, y) => new { x, y }).All(z => Compare(z.x, z.y));

答案 1 :(得分:2)

您可以使用All

bool comparisonResult = l1.All(x => l2.Any(y => Compare(x, y)));

只有当l1中的所有项都与内部条件匹配时才会返回true - 这就是它们存在于l2中。这是一种更容易阅读的方式,即应用&#34;而不是&#34;两次。

这不会解决列表中重复项目的情况,因此您可以:

  1. 区分列表
  2. 在内部函数中执行Where和count等于1