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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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