猿教程 Logo

Linq等式运算符:SequenceEqual

只有一个相等运算符:SequenceEqual。 SequenceEqual方法检查元素的数量,每个元素的值和两个集合中元素的顺序是否相等。

如果集合包含原始数据类型的元素,则它比较元素的值和数量,而如果使用复杂类型元素的集合,则检查对象的引用。 因此,如果对象具有相同的引用,则它们被认为是相等的,否则它们被认为不相等。

以下示例演示了使用基本数据类型集合的SequenceEqual方法。

相关实例:

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
Console.WriteLine(isEqual);

运行结果:

true

如果元素的顺序不同,则SequenceEqual()方法返回false。

相关实例:

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
Console.WriteLine(isEqual);

运行结果:

false

SequenceEqual扩展方法检查两个对象的引用以确定两个序列是否相等。 这可能会导致错误的结果。 请考虑以下示例:

相关实例:

Student std = new Student() { StudentID = 1, 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 = new Student() { StudentID = 1, StudentName = "Bill" };
Student std2 = new Student() { StudentID = 1, 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();
    }
}

现在,您可以使用SequenceEqual扩展方法中的上述StudentComparer类作为第二个参数来比较值:

相关实例:

IList<Student> studentList1 = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
        new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
    };

IList<Student> studentList2 = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
        new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
    };
// following returns true
bool isEqual = studentList1.SequenceEqual(studentList2, new StudentComparer());
要点
  1. SequenceEqual方法比较了原始数据类型的项目数量及其值。 

  2. SequenceEqual方法比较复杂数据类型的对象引用。 

  3. 使用IEqualityComparer类来使用SequenceEqual方法比较复杂类型的两个集合。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-equality-operator.html