diff --git a/LinqStudy.Test/LinqToObject/SequenceEqualTest.cs b/LinqStudy.Test/LinqToObject/SequenceEqualTest.cs new file mode 100644 index 0000000..981c1ea --- /dev/null +++ b/LinqStudy.Test/LinqToObject/SequenceEqualTest.cs @@ -0,0 +1,248 @@ +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(); + } + } + } +}