using System; using System.Collections.Generic; using System.Text; using System.Linq; using Xunit; using FluentAssertions; using System.Collections; namespace LinqStudy.Test.LinqToObject { /// /// 序列相等 /// public class SequenceEqualTest { /// /// SequenceEqual /// 序列相等比较:所含项数量相同、内容相同、位置相同、引用类型则引用相同的对象,则两个序列相等。 /// [Fact] public void SequenceEqual_Test() { List sequence = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, new Person(){Id=1,Name="王五",Age=20}, }; List sequence1 = sequence; List sequence2 = sequence; Assert.True(sequence1.SequenceEqual(sequence2)); } /// /// 引用类型相等:项数量相同、内容相同、位置相同、引用对象相同 /// [Fact] public void SequenceEqual_Query_Test() { List sequence = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=2,Name="李四",Age=30}, new Person(){Id=3,Name="王五",Age=40}, }; //查询结果相同,引用对象也相同。 var sequence1 = sequence.Where(p => p.Id > 2); var sequence2 = sequence.Where(p => p.Age > 30); Assert.True(sequence1.SequenceEqual(sequence2)); } /// /// 值类型相等:项数量相同、内容相同、位置相同 /// [Fact] public void SequenceEqual_ValueType_Test() { List sequence1 = new List() { 1, 2, 3 }; List sequence2 = new List() { 1, 2, 3 }; Assert.True(sequence1.SequenceEqual(sequence2)); } /// /// 引用不同 /// [Fact] public void SequenceEqual_Reference_Test() { List sequence1 = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, }; List sequence2 = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, }; Assert.False(sequence1.SequenceEqual(sequence2)); } /// /// 内容不一样 /// [Fact] public void SequenceEqual_Content_Test() { List sequence1 = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, new Person(){Id=1,Name="王五",Age=20}, }; List sequence2 = new List() { new Person(){Id=1,Name="张三2",Age=20}, new Person(){Id=1,Name="李四",Age=20}, new Person(){Id=1,Name="王五",Age=20}, }; Assert.False(sequence1.SequenceEqual(sequence2)); } /// /// 数量不一样 /// [Fact] public void SequenceEqual_Count_Test() { List sequence1 = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, }; List sequence2 = new List() { new Person(){Id=1,Name="张三",Age=20}, }; Assert.False(sequence1.SequenceEqual(sequence2)); } /// /// 位置不同 /// [Fact] public void SequenceEqual_Position_Test() { List sequence1 = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, }; List sequence2 = new List() { new Person(){Id=1,Name="李四",Age=20}, new Person(){Id=1,Name="张三",Age=20}, }; Assert.False(sequence1.SequenceEqual(sequence2)); } /// /// 重载比较方法,实现自动义比较 /// [Fact] public void SequenceEqual_OverrideEquals_Test() { List sequence1 = new List() { new Student(){Id=1,Name="张三",Age=20}, new Student(){Id=1,Name="李四",Age=20}, }; List sequence2 = new List() { new Student(){Id=1,Name="李四",Age=20}, new Student(){Id=1,Name="张三",Age=20}, }; Assert.True(sequence1.SequenceEqual(sequence2)); } /// /// 提供自定义比较器 /// [Fact] public void Test() { List sequence1 = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, }; List sequence2 = new List() { new Person(){Id=1,Name="张三",Age=20}, new Person(){Id=1,Name="李四",Age=20}, }; Assert.True(sequence1.SequenceEqual(sequence2, new PersonEqual())); } /// /// 自定义Person比较器 /// Id相同,则表示同一个对象 /// private class PersonEqual : IEqualityComparer { bool IEqualityComparer.Equals(Person x, Person y) { if (x==null || y==null) { return false; } return x.Id == y.Id; } int IEqualityComparer.GetHashCode(Person obj) { return obj.Id.GetHashCode(); } } /// /// 重写比较方法 /// private class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var other = obj as Student; if (other == null) { return false; } return Id==other.Id; } public override int GetHashCode() { return this.Id.GetHashCode(); } } } }