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.

301 lines
10 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 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>()
{
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.Id);
var firtId = oprationItem.First().Id;
var lastId = oprationItem.Last().Id;
Assert.Equal(1,firtId);
Assert.Equal(3, lastId);
}
/// <summary>
/// 延迟执行
/// </summary>
[Fact]
public void OrderBy_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.OrderBy(p => p.Id);
var addItem = new Person() { Id = 4, Name = "赵立", Age = 87 };
peoples.Add(addItem);
var firtId = oprationItem.First().Id;
var lastId = oprationItem.Last().Id;
Assert.Equal(1, firtId);
Assert.Equal(4, lastId);
}
/// <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);
var addItem = new Person() { Id = 4, Name = "赵立", Age = 87 };
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 },
new Person(){ Id = 2, Name = "赵立", Age=11 },
};
//先按Id排序Id相同的再按年龄排序。
var oprationItem = peoples.OrderBy(p => p.Id).ThenBy(p => p.Age).Select(p => p.Name);
var expected = new List<string>() { "李四", "张三", "赵立", "王五" };
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 },
new Person(){ Id = 2, Name = "赵立", Age=11 },
};
var oprationItem = peoples.OrderBy(p => p.Id).ThenBy(p => p.Age);
var addItme = new Person() { Id = 1, Name = "刘能", Age = 2 };
peoples.Add(addItme);
var actual = oprationItem.Select(p => p.Name).ToList();
var expected = new List<string>() { "刘能", "李四", "张三", "赵立", "王五" };
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 },
new Person(){ Id = 2, Name = "赵立", Age=11 },
};
var oprationItem = peoples.OrderBy(p => p, new PersonComparer()).ThenBy(p=>p.Age,Comparer<int>.Default);
var actual = oprationItem.Select(p => p.Name).ToList();
var expected = new List<string>() {"李四", "张三", "赵立", "王五" };
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 },
new Person(){ Id = 2, Name = "赵立", Age=11 },
};
//先按Id排序Id相同的再按年龄排序。
var oprationItem = peoples.OrderBy(p => p.Id).ThenByDescending(p => p.Age).Select(p => p.Name);
var expected = new List<string>() {"张三","李四","王五", "赵立"};
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 },
new Person(){ Id = 2, Name = "赵立", Age=11 },
};
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();
var expected = new List<string>() { "张三", "李四", "刘能", "王五","赵立" };
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 },
new Person(){ Id = 2, Name = "赵立", Age=11 },
};
var oprationItem = peoples.OrderBy(p => p, new PersonComparer()).ThenByDescending(p => p.Age, Comparer<int>.Default);
var actual = oprationItem.Select(p => p.Name).ToList();
var expected = new List<string>() { "张三","李四", "王五", "赵立",};
Assert.Equal(expected, actual);
}
#endregion
}
}