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.

368 lines
12 KiB
C#

6 years ago
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Linq.Expressions;
using Xunit;
namespace LinqStudy.Test.LinqToObject
{
/// <summary>
/// 排序操作符
/// 数据源为null时均引发ArgumentNullException异常
/// </summary>
public class OrderTest
{
#region OrderBy
/// <summary>
/// OrderBy升序排序(从小到大);延迟执行
/// </summary>
[Fact]
public void OrderBy_Test()
{
List<Person> peoples = new List<Person>()
{
6 years ago
new Person(){ Id = 3, Name = "张三", Age=33 },
new Person(){ Id = 5, Name = "王五", Age=55 },
new Person(){ Id = 4, Name = "李四", Age=44 },
6 years ago
};
var oprationItem = peoples.OrderBy(p => p.Id);
6 years ago
var firtName = oprationItem.First().Name;
6 years ago
6 years ago
Assert.Equal("张三", firtName);
6 years ago
}
/// <summary>
/// 延迟执行
/// </summary>
[Fact]
public void OrderBy_Delay_Test()
{
List<Person> peoples = new List<Person>()
{
6 years ago
new Person(){ Id = 3, Name = "张三", Age=33 },
new Person(){ Id = 5, Name = "王五", Age=55 },
new Person(){ Id = 4, Name = "李四", Age=44 },
6 years ago
};
var oprationItem = peoples.OrderBy(p => p.Id);
6 years ago
peoples.Insert(0, new Person() { Id = 6, Name = "赵六", Age = 66 });
6 years ago
6 years ago
//执行一次排序
var firtName = oprationItem.First().Name;
//再执行一次排序
var lastName = oprationItem.Last().Name;
6 years ago
6 years ago
Assert.Equal("张三", firtName);
6 years ago
Assert.Equal("赵六", lastName);
6 years ago
}
/// <summary>
/// 重载自定义Comparable比较器
/// </summary>
[Fact]
public void OrderBy_CustomComparable_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=33 },
new Person(){ Id = 3, Name = "李四", Age=65 },
new Person(){ Id = 2, Name = "王五", Age=17 },
};
var oprationItem = peoples.OrderBy(p => p, new PersonComparer());
var firtId = oprationItem.First().Id;
var lastId = oprationItem.Last().Id;
Assert.Equal(1, firtId);
Assert.Equal(3, lastId);
}
#endregion
#region OrderByDescending
/// <summary>
/// OrderByDescending降序排序(从大到步);延迟执行
/// </summary>
[Fact]
public void OrderByDescending_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=33 },
new Person(){ Id = 3, Name = "李四", Age=65 },
new Person(){ Id = 2, Name = "王五", Age=17 },
};
var oprationItem = peoples.OrderByDescending(p => p.Id);
var firtId = oprationItem.First().Id;
var lastId = oprationItem.Last().Id;
Assert.Equal(3, firtId);
Assert.Equal(1, lastId);
}
/// <summary>
/// 延迟执行
/// </summary>
[Fact]
public void OrderByDescending_Delay_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=33 },
new Person(){ Id = 3, Name = "李四", Age=65 },
new Person(){ Id = 2, Name = "王五", Age=17 },
};
var oprationItem = peoples.OrderByDescending(p => p.Id);
6 years ago
var addItem = new Person() { Id = 4, Name = "赵六", Age = 87 };
6 years ago
peoples.Add(addItem);
var firtId = oprationItem.First().Id;
var lastId = oprationItem.Last().Id;
Assert.Equal(4, firtId);
Assert.Equal(1, lastId);
}
/// <summary>
/// 重载自定义Comparable比较器
/// </summary>
[Fact]
public void OrderByDescending_CustomComparable_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=33 },
new Person(){ Id = 3, Name = "李四", Age=65 },
new Person(){ Id = 2, Name = "王五", Age=17 },
};
var oprationItem = peoples.OrderByDescending(p => p, new PersonComparer());
var firtId = oprationItem.First().Id;
var lastId = oprationItem.Last().Id;
Assert.Equal(3, firtId);
Assert.Equal(1, lastId);
}
#endregion
#region ThenBy
/// <summary>
/// ThenBy按次要关键字进行升序排序(从小到大);延迟执行
/// </summary>
[Fact]
public void ThenBy_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 1, Name = "李四", Age=33 },
new Person(){ Id = 2, Name = "王五", Age=22 },
6 years ago
new Person(){ Id = 2, Name = "赵六", Age=11 },
6 years ago
};
//先按Id排序Id相同的再按年龄排序。
var oprationItem = peoples.OrderBy(p => p.Id).ThenBy(p => p.Age).Select(p => p.Name);
6 years ago
var expected = new List<string>() { "李四", "张三", "赵六", "王五" };
6 years ago
Assert.Equal(expected, oprationItem);
}
/// <summary>
/// 延迟执行
/// </summary>
[Fact]
public void ThenBy_Delay_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 1, Name = "李四", Age=33 },
new Person(){ Id = 2, Name = "王五", Age=22 },
6 years ago
new Person(){ Id = 2, Name = "赵六", Age=11 },
6 years ago
};
var oprationItem = peoples.OrderBy(p => p.Id).ThenBy(p => p.Age);
6 years ago
6 years ago
var addItme = new Person() { Id = 1, Name = "刘能", Age = 2 };
peoples.Add(addItme);
var actual = oprationItem.Select(p => p.Name).ToList();
6 years ago
var expected = new List<string>() { "刘能", "李四", "张三", "赵六", "王五" };
6 years ago
Assert.Equal(expected, actual);
}
/// <summary>
/// 重载自定义Comparable比较器
/// </summary>
[Fact]
public void ThenBy_CustomComparable_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 1, Name = "李四", Age=33 },
new Person(){ Id = 2, Name = "王五", Age=22 },
6 years ago
new Person(){ Id = 2, Name = "赵六", Age=11 },
6 years ago
};
6 years ago
var oprationItem = peoples.OrderBy(p => p, new PersonComparer()).ThenBy(p => p.Age, Comparer<int>.Default);
6 years ago
var actual = oprationItem.Select(p => p.Name).ToList();
6 years ago
var expected = new List<string>() { "李四", "张三", "赵六", "王五" };
6 years ago
Assert.Equal(expected, actual);
}
#endregion
#region ThenByDescending
/// <summary>
/// ThenByDescending按次要关键字进行降序排序(从大到小);延迟执行
/// </summary>
[Fact]
public void ThenByDescending_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 1, Name = "李四", Age=33 },
new Person(){ Id = 2, Name = "王五", Age=22 },
6 years ago
new Person(){ Id = 2, Name = "赵六", Age=11 },
6 years ago
};
//先按Id排序Id相同的再按年龄排序。
var oprationItem = peoples.OrderBy(p => p.Id).ThenByDescending(p => p.Age).Select(p => p.Name);
6 years ago
var expected = new List<string>() { "张三", "李四", "王五", "赵六" };
6 years ago
Assert.Equal(expected, oprationItem);
}
/// <summary>
/// 延迟执行
/// </summary>
[Fact]
public void ThenByDescending_Delay_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 1, Name = "李四", Age=33 },
new Person(){ Id = 2, Name = "王五", Age=22 },
6 years ago
new Person(){ Id = 2, Name = "赵六", Age=11 },
6 years ago
};
var oprationItem = peoples.OrderBy(p => p.Id).ThenByDescending(p => p.Age);
var addItme = new Person() { Id = 1, Name = "刘能", Age = 2 };
peoples.Add(addItme);
var actual = oprationItem.Select(p => p.Name).ToList();
6 years ago
var expected = new List<string>() { "张三", "李四", "刘能", "王五", "赵六" };
6 years ago
Assert.Equal(expected, actual);
}
/// <summary>
/// 重载自定义Comparable比较器
/// </summary>
[Fact]
public void ThenByDescending_CustomComparable_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 1, Name = "李四", Age=33 },
new Person(){ Id = 2, Name = "王五", Age=22 },
6 years ago
new Person(){ Id = 2, Name = "赵六", Age=11 },
6 years ago
};
var oprationItem = peoples.OrderBy(p => p, new PersonComparer()).ThenByDescending(p => p.Age, Comparer<int>.Default);
var actual = oprationItem.Select(p => p.Name).ToList();
6 years ago
var expected = new List<string>() { "张三", "李四", "王五", "赵六", };
6 years ago
Assert.Equal(expected, actual);
}
#endregion
6 years ago
#region Resevse
/// <summary>
/// Resevse反序序列(逆向);立即执行
/// </summary>
[Fact]
public void Resevse_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 2, Name = "李四", Age=33 },
};
//简单逆序
peoples.Reverse();
var firstId = peoples.First().Id;
Assert.Equal(2, firstId);
}
/// <summary>
/// Resevse反序序列(逆向);立即执行
/// </summary>
[Fact]
public void Resevse_immediately_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=33 },
new Person(){ Id = 2, Name = "李四", Age=44 },
};
//简单逆序
peoples.Reverse();
peoples.Add(new Person() { Id = 3, Name = "云花公主", Age = 18 });
//数据源变化,不影响结果。
var firstId = peoples.First().Id;
Assert.Equal(2, firstId);
}
/// <summary>
/// Resevse重载index开始项count反序项的数量
/// </summary>
[Fact]
public void Resevse_index_count_Test()
{
List<Person> peoples = new List<Person>()
{
new Person(){ Id = 1, Name = "张三", Age=44 },
new Person(){ Id = 2, Name = "李四", Age=33 },
new Person(){ Id = 3, Name = "王五", Age=44 },
new Person(){ Id = 4, Name = "赵六", Age=33 },
};
//从指定位置开始逆序指定数量的项。
//从序号为1(第2项)开始反序2项即反序第2第3两项。
peoples.Reverse(1, 2);
var secondId = peoples[1].Id;
var thirdId = peoples[2].Id;
Assert.Equal(3, secondId);
Assert.Equal(2, thirdId);
}
#endregion
6 years ago
}
}