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