You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
7.0 KiB
C#

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();
}
}
}
}