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.

168 lines
6.5 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.Collections;
using System.Collections.Generic;
using System.Linq;
using Xunit;
using LinqStudy;
namespace LinqStudy.Test.LinqToObject
{
/// <summary>
/// 分组操作符
/// </summary>
public class GroupTest
{
/// <summary>
/// GroupBy: 根据指定的键选择器函数对序列的元素进行分组;延迟执行。
/// 注意Key即分组依据可以常用的值类型也可以是引用类型(可以自定义比较器))
/// </summary>
[Fact]
public void GroupBy_Default_Test()
{
List<Person> peoples=new List<Person>()
{
new Person(){Id=1, Name="Andy", Age=10},
new Person(){Id=2, Name="Bab", Age=20},
new Person(){Id=3, Name="Babs", Age=20},
new Person(){Id=4, Name="Cara", Age=30},
new Person(){Id=5, Name="Carlton", Age=30},
new Person(){Id=6, Name="Cora", Age=30},
new Person(){Id=7, Name="Dawn", Age=40},
new Person(){Id=8, Name="Debby", Age=40},
new Person(){Id=9, Name="Dotty", Age=40},
new Person(){Id=10, Name="Dove", Age=40},
};
var group = peoples.GroupBy(p=>p.Age);
var groupCount = group.Count();
Assert.Equal(4,groupCount);
}
/// <summary>
/// 延迟执行
/// </summary>
[Fact]
public void GroupBy_Delay_Test()
{
List<Person> peoples=new List<Person>()
{
new Person(){Id=1, Name="Andy", Age=10},
new Person(){Id=2, Name="Bab", Age=20},
new Person(){Id=3, Name="Babs", Age=20},
new Person(){Id=4, Name="Cara", Age=30},
new Person(){Id=5, Name="Carlton", Age=30},
new Person(){Id=6, Name="Cora", Age=30},
};
var group = peoples.GroupBy(p=>p.Age);
//改变数据源
List<Person> peoples2=new List<Person>()
{
new Person(){Id=7, Name="Dawn", Age=40},
new Person(){Id=8, Name="Debby", Age=40},
new Person(){Id=9, Name="Dotty", Age=40},
new Person(){Id=10, Name="Dove", Age=40},
};
peoples.AddRange(peoples2);
//受数据源变化的影响,说明是延迟执行。
var groupCount = group.Count();
Assert.Equal(4,groupCount);
}
/// <summary>
/// 重载keySelector comparer
/// key是引用类型使用自定义比较器
/// </summary>
[Fact]
public void GroupBy_keySelector_comparer_Test()
{
List<Teacher> peoples=new List<Teacher>()
{
new Teacher(){Id=1, Name="河南周口人", Hometown=new Hometown(){Province="河南", City="周口"}},
new Teacher(){Id=2, Name="俺河南周口哩", Hometown=new Hometown(){Province="河南",City="周口"}},
new Teacher(){Id=3, Name="上海宝山人", Hometown=new Hometown(){Province="上海",City="宝山"}},
new Teacher(){Id=4, Name="上海松江人", Hometown=new Hometown(){Province="上海",City="松江"}},
};
var group = peoples.GroupBy(p=>p.Hometown,new HometownEqualityComparer());
var groupFirstNames=group.First().Select(q=>q.Name).ToList();
var expected=new List<string>(){"河南周口人","俺河南周口哩"};
Assert.Equal(expected,groupFirstNames);
}
/// <summary>
/// 重载keySelector elementSelector
/// key是引用类型使用自定义比较器
/// </summary>
[Fact]
public void GroupBy_keySelector_elementSelector_Test()
{
List<Teacher> peoples=new List<Teacher>()
{
new Teacher(){Id=1, Name="河南周口人", Hometown=new Hometown(){Province="河南", City="周口"}},
new Teacher(){Id=1, Name="俺河南周口哩", Hometown=new Hometown(){Province="河南",City="周口"}},
new Teacher(){Id=2, Name="上海宝山人", Hometown=new Hometown(){Province="上海",City="宝山"}},
new Teacher(){Id=3, Name="上海松江人", Hometown=new Hometown(){Province="上海",City="松江"}},
};
var group = peoples.GroupBy(p=>p.Id,t=>t.Name).ToList();
var groupFirstNames=group[2].FirstOrDefault();
var expected="上海松江人";
Assert.Equal(expected,groupFirstNames);
}
/// <summary>
/// 重载keySelector elementSelector comparer
/// </summary>
[Fact]
public void GroupBy_keySelector_elementSelector_comparer_Test()
{
List<Teacher> peoples=new List<Teacher>()
{
new Teacher(){Id=1, Name="河南周口人", Hometown=new Hometown(){Province="河南", City="周口"}},
new Teacher(){Id=2, Name="俺河南周口哩", Hometown=new Hometown(){Province="河南",City="周口"}},
new Teacher(){Id=3, Name="上海宝山人", Hometown=new Hometown(){Province="上海",City="宝山"}},
new Teacher(){Id=4, Name="上海松江人", Hometown=new Hometown(){Province="上海",City="松江"}},
};
var group = peoples.GroupBy(p=>p.Hometown,t=>t.Name,new HometownEqualityComparer()).ToList();
var groupFirstNames=group[2].FirstOrDefault();
var expected="上海松江人";
Assert.Equal(expected,groupFirstNames);
}
[Fact]
public void GroupBy_keySelector_resultSelector_Test()
{
List<Teacher> peoples=new List<Teacher>()
{
new Teacher(){Id=1, Name="河南周口人", Hometown=new Hometown(){Province="河南", City="周口"}},
new Teacher(){Id=1, Name="俺河南周口哩", Hometown=new Hometown(){Province="河南",City="周口"}},
new Teacher(){Id=3, Name="上海宝山人", Hometown=new Hometown(){Province="上海",City="宝山"}},
new Teacher(){Id=4, Name="上海松江人", Hometown=new Hometown(){Province="上海",City="松江"}},
};
var group = peoples.GroupBy(p=>p.Id, (key,teacher) => teacher.Select(t=>t.Name)).ToList();
var groupFirstNames=group[2].FirstOrDefault();
var expected="上海松江人";
Assert.Equal(expected,groupFirstNames);
}
}
}