比较LINQ中两个对象的属性值

时间:2014-05-05 00:14:27

标签: linq c#-4.0

我的代码List<student> list1List<student> list2中有两个学生对象列表。 student对象具有以下属性。 FirstName LastName University

我有以下方法,我想使用LINQ比较两个列表中对象之间的相应属性的值。我在LINQ中找到了一些示例,它们展示了如何比较整数或字符串列表中的两个值,但找不到任何比较List中对象的属性值的示例。

`private CompareList(ref List<student> L1,ref List<student> L2)
 {
   // compare FirstName of L1 to L2
      ......

 }`

我该怎么做呢? 谢谢!

3 个答案:

答案 0 :(得分:3)

public static bool Compare(ref List<Student> list1, ref List<Student> list2)
{
        return Enumerable.SequenceEqual(list1,list2, new MyCustomComparer());
}

public class MyCustomComparer : IEqualityComparer<Student>
{
    public bool Equals(Student x, Student y)
    {
        if (x.FirstName == y.FirstName && x.LastName == y.LastName && x.University == y.University)
            return true;
        return false;
    }

    public int GetHashCode(Student obj)
    {
        throw new NotImplementedException();
    }
}

答案 1 :(得分:1)

你没有说出你想要检查的内容,但如果你只是想知道两个收藏是否相等那么我想你可以这样检查:

bool isAnyElementFromL1NotInL2 = L1.Select(x => x.Name).Except(L2.Select(y => y.Name)).Any();
bool isAnyElementFromL2NotInL1 = L2.Select(x => x.Name).Except(L1.Select(y => y.Name)).Any();
bool areL1AndL2TheSame = !isAnyElementFromL1NotInL2 && !isAnyElementFromL2NotInL1;

另见this answer by Jon Skeet

this question

答案 2 :(得分:1)

最好的方法是通过实施student / IComparable<student>IStructuralComparable / {来IEquatable<student>(传统上Pascal类型)可比较{1}}或创建一个实现IStructuralEquatable的比较器类。