c#中实现IEnumerable
Student类:
public class Student
{
public int StuId { get; set; }
public string ClassName { get; set; }
public string StudentName { get; set; }
}
设定数据如下:
List studentList = new List
{
new Student {ClassName = "软工一班", StudentName = "康巴一", StuId = 1},
new Student {ClassName = "软工一班", StudentName = "康巴二", StuId = 2},
new Student {ClassName = "软工一班", StudentName = "康巴三", StuId = 3},
new Student {ClassName = "软工二班", StudentName = "康定一", StuId = 4},
new Student {ClassName = "软工二班", StudentName = "康定二", StuId = 5},
new Student {ClassName = "软工二班", StudentName = "康定三", StuId = 6},
};
我们假设两个班里的学生总共有六名,现在根据班级分组
IEnumerable> studentGroup = studentList.GroupBy(s => s.ClassName);
如代码,调用GroupBy扩展方法后,返回类型为IEnumerable
可以首先foreach一下studentGroup
foreach (IGrouping item in studentGroup)
{
}
这时候可以item.一下看看提示信息
这时候发现,只能提示出来的属性只有一个key,那么怎样通过item获取到分组后的Student集合呢?这时候发现第二个GetEnumerator()方法,这个说明了item是可以被foreach的,类型为IEnumerator
然后可以foreach下item试一试
如果所示,果然是Student,根据推断,现在在foreach中遍历所有数据,然后打出来看一下
foreach (IGrouping item in studentGroup)
{
Console.WriteLine(item.Key);
foreach (var student in item)
{
Console.WriteLine(student.StudentName);
}
}
执行结果如下:
所以可以断定item是一个Student的集合,那么为什么item还有个key属性呢,好像是和平常的集合不太一样,事实确实是不一样的,我们看下IGrouping的定义如下:
public interface IGrouping : IEnumerable, IEnumerable
{
///
/// 获取 的键。
///
///
///
/// 的键。
///
[__DynamicallyInvokable]
TKey Key { [__DynamicallyInvokable] get; }
}
IGrouping的key是作为自己的属性来存储了,TElement则实现了IEnumerable
这个探索是挺有趣的,通过神器vs的智能提示和源码的实现最终知道了GroupBy的用法,并且了解了为什么这样用。
同时也看出了通过接口可以巧妙的实现多态,其中自然是妙趣无穷!