排序操作符

master
bicijinlian 6 years ago
parent 8d9f699235
commit 4a1f9c712f

@ -0,0 +1,300 @@
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
}
}

@ -281,8 +281,8 @@ namespace LinqStudy.Test.LinqToObject
var people = new Person() { Id = 3, Name = "小清闲", Age = 88 };
//自定义比较器Id相同即为同一个对象
PersonEqualId equalId = new PersonEqualId();
var anyQuery = peoples.Contains(people, new PersonEqualId());
PersonEqualityComparerById equalId = new PersonEqualityComparerById();
var anyQuery = peoples.Contains(people, new PersonEqualityComparerById());
//比较器相等,即包含
Assert.True(anyQuery);

@ -192,7 +192,7 @@ namespace LinqStudy.Test.LinqToObject
new Person(){Id=1,Name="李四",Age=20},
};
Assert.True(sequence1.SequenceEqual(sequence2, new PersonEqual()));
Assert.True(sequence1.SequenceEqual(sequence2, new PersonEqualityComparer()));
}
}
}

@ -18,7 +18,7 @@
## 分组操作符
## 串联操作符
## 集合操作符
## 聚合操作符
@ -31,8 +31,11 @@
## 相等操作符
## 量词操作符
Any
## 分割操作符
All
## 分区操作符
Take 返回序列中,从0开始的连续指定项数据子序列延迟执行。
TakeWhile

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
namespace LinqStudy
{
/// <summary>
/// Person±È½ÏÆ÷£ºIdΪ±È½Ï±ê×¼
/// </summary>
public class PersonComparer : IComparer<Person>
{
int IComparer<Person>.Compare(Person x, Person y)
{
int compareResult = 0;
if (x == null && y == null)
{
compareResult = 0;
}
else if (x == null)
{
compareResult = 1;
}
else if (y == null)
{
compareResult = -1;
}
else
{
if (x.Id == y.Id)
{
compareResult = 0;
}
else if (x.Id > y.Id)
{
compareResult = 1;
}
else
{
compareResult = -1;
}
}
return compareResult;
}
}
}

@ -5,10 +5,10 @@ using System.Text;
namespace LinqStudy
{
/// <summary>
/// Person自定义比较器
/// Person 自定义相等比较器
/// 各属性均同,则相等.有一个Null值则不相等。
/// </summary>
public class PersonEqual : IEqualityComparer<Person>
public class PersonEqualityComparer : IEqualityComparer<Person>
{
bool IEqualityComparer<Person>.Equals(Person x, Person y)
{

@ -5,10 +5,10 @@ using System.Text;
namespace LinqStudy
{
/// <summary>
/// Person 自定义ID比较器
/// Person 自定义ID相等比较器
/// Id相同则视为相同
/// </summary>
public class PersonEqualId : IEqualityComparer<Person>
public class PersonEqualityComparerById : IEqualityComparer<Person>
{
bool IEqualityComparer<Person>.Equals(Person x, Person y)
{
Loading…
Cancel
Save