Linq 等式运算符:SequenceEqual(转载)

https://www.bbsmax.com/A/nAJvbKywJr/

引用类型比较的是引用,需要自己实现IEqualityComparer 比较器。

IList<string> strList1 = new List<string>(){"One", "Two", "Three", "Four", "Three"};
 
IList<string> strList2 = new List<string>(){"One", "Two", "Three", "Four", "Three"};
 
bool isEqual = strList1.SequenceEqual(strList2); // returns true
 
IList<string> strList1 = new List<string>(){"One", "Two", "Three", "Four", "Three"};
 
IList<string> strList2 = new List<string>(){ "Two", "One", "Three", "Four", "Three"};
 
bool isEqual = strList1.SequenceEqual(strList2); // returns false
 
//如果是引用类型,则比较的是引用
Student std = , StudentName = "Bill" };
 
IList<Student> studentList1 = new List<Student>(){ std };
 
IList<Student> studentList2 = new List<Student>(){ std };
 
bool isEqual = studentList1.SequenceEqual(studentList2); // returns true
 
Student std1 = , StudentName = "Bill" };
Student std2 = , StudentName = "Bill" };
 
IList<Student> studentList3 = new List<Student>(){ std1};
 
IList<Student> studentList4 = new List<Student>(){ std2 };
 
isEqual = studentList3.SequenceEqual(studentList4);// returns false
 
在上面的示例中,studentList1和studentList2包含相同的学生对象std。 所以studentList1.SequenceEqual(studentList2)返回true。 但是,stdList1和stdList2包含两个独立的学生对象std1和std2。 所以现在,stdList1.SequenceEqual(stdList2)将返回false,即使std1和std2包含相同的值。
 
要比较复杂类型(引用类型或对象)的两个集合的值,您需要实现IEqualityComperar <T>接口,如下所示。
 
class StudentComparer : IEqualityComparer<Student>
{
    public bool Equals(Student x, Student y)
    {
        if (x.StudentID == y.StudentID && x.StudentName.ToLower() == y.StudentName.ToLower())
            return true;
 
        return false;
    }
 
    public int GetHashCode(Student obj)
    {
        return obj.GetHashCode();
    }
}
 
// following returns true
bool isEqual = studentList1.SequenceEqual(studentList2, new StudentComparer());

 

posted @ 2019-08-20 18:37  hao_1234_1234  阅读(932)  评论(0编辑  收藏  举报