1.首先我们有这样一个学生实体,学生与课程是一对多关系
public class Student
{
/// <summary>
/// Id
/// </summary>
public string Id { get; set; }
/// <summary>
/// 学生名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 课程名
/// </summary>
public string CourseName { get; set; }
/// <summary>
/// 分数
/// </summary>
public double Grade { get; set; }
}
需求,统计每个学生所对应的课程及分数
先创建一些模拟数据=>
public static List<Student> GetList()
{
return new List<Student>
{
new Student {Id = "1",Name = "1", Age = 25, CourseName = "数学", Grade = 85, },
new Student {Id = "1",Name = "1", Age = 25, CourseName = "英语", Grade = 99, },
new Student {Id = "2",Name = "2", Age = 27, CourseName = "数学", Grade = 49, },
new Student {Id = "3",Name = "3", Age = 28, CourseName = "数学", Grade = 77, },
new Student {Id = "3",Name = "3", Age = 28, CourseName = "英语", Grade = 15, },
new Student {Id = "4",Name = "4", Age = 25, CourseName = "数学", Grade = 100, }
};
}
方案一:GroupBy
var list=list.GroupBy(s => s.Name).ToList();
方案二:字典Dictionary
Dictionary<string, List<Student>> dic = new Dictionary<string, List<Student>>();
foreach (var item in GetList())
{
if (!dic.ContainsKey(item.Name))
{
dic.Add(item.Name, new List<Student> { item });
}
else
{
dic[item.Name].Add(item);
}
}
方案三:ToLookup
var dic=GetList().ToLookup(i => i.Name);
//var dic = list.ToLookup(i => i.Name,s=>"姓名:"+s.CourseName+"\t"+ "成绩:"+s.Grade);
控制台输出=>
var dic=GetList().ToLookup(i => i.Name);
foreach (var items in dic)
{
Console.WriteLine("姓名:"+items.Key);
foreach (var item in items)
{
Console.WriteLine("\t\t" + "课程名:"+item.CourseName + " " +"分数:"+ item.Grade);
}
}
区别:
Lookup<string,Student>相当于Dictionary<string,List<Student>>
Lookup与GroupBy的区别在于很好的支持索引,可以像字典一样使用dic["key"]