本人第一次写技术博客,如有错误之处,请指出,3Q!
共同学习,共同努力!!!
之前同事问了我一个问题,假如数据库里有一张表University(大学),表中有3列,分别是City(所在城市),Name(大学名称),Number(编号),如何将表中的数据先按照大学所在城市排序,再按照大学编号排序。其实这个问题很简单,如果写SQL语句肯定是要使用GroupBy分组函数进行分组。
其实最后我并没有推荐同事使用sql的方式实现,而是使用了LinQ中的GroupBy,代码简单,但是第一次编码的时候,还是出现了很多问题。
官方文档:http://msdn.microsoft.com/zh-cn/library/system.linq.enumerable.groupby(v=vs.110).aspx
University大学实体类:
///
/// 大学实体类
///
public class University
{
///
/// 所在城市
///
public string City { get; set; }
///
/// 大学名称
///
public string Name { get; set; }
///
/// 编号
///
public int Number { get; set; }
}
List UniversityList = new List();
UniversityList.Add(new University { City = "北京", Name = "北京大学", Number = 1 });
UniversityList.Add(new University { City = "上海", Name = "同济大学", Number = 5 });
UniversityList.Add(new University { City = "天津", Name = "南开大学", Number = 8 });
UniversityList.Add(new University { City = "北京", Name = "清华大学", Number = 2 });
UniversityList.Add(new University { City = "安徽", Name = "中国科技大学", Number = 10 });
UniversityList.Add(new University { City = "北京", Name = "外国语大学", Number = 4 });
UniversityList.Add(new University { City = "上海", Name = "交通大学", Number = 7 });
UniversityList.Add(new University { City = "浙江", Name = "浙江大学", Number = 9 });
UniversityList.Add(new University { City = "广东", Name = "暨南大学", Number = 12 });
UniversityList.Add(new University { City = "上海", Name = "华东科技大学", Number = 6 });
UniversityList.Add(new University { City = "北京", Name = "人民大学", Number = 3 });
UniversityList.Add(new University { City = "广东", Name = "厦门大学", Number = 13 });
UniversityList.Add(new University { City = "广东", Name = "中山大学", Number = 11 });
//分组并排序
var GroupList = UniversityList.GroupBy(x => x.City).OrderBy(x => x.Key);
//下面这个集合是最终处理结果的集合
List newList = new List();
foreach (var university in GroupList)
{
//将上面分组的集合转换为泛型集合,并再次按照Number排序
List tempList = university.ToList().OrderBy(x => x.Number).ToList();
/*
*以上代码也可以这样写
*List tempList = university.ToList();
*tempList = tempList.OrderBy(x => x.Number).ToList();
*/
foreach (University u in tempList)
{
newList.Add(u);
}
}
gvList.DataSource = newList;
gvList.DataBind();
代码很容易理解,没有复杂的逻辑。
需要注意的是在分组排序时,大家可能注意到,我使用的var类型去接收的。
本人第一次编写时,犯了一个特大的错误,后来才知道GroupBy集合后,类型就发生了转变,变为一个带有key值得集合:IEnumerable
还有一点需要注意的是,当GroupBy后,再次OrderBy时,参数Lambda表达式只能调出一个属性,就是Key,这个属性实际上就是前面GroupBy中的属性。