GroupBy是按照Item的hashCode来分组的,所以Item最好是override GetHashCode()方法
namespace ConsoleApplication5 { class Program { static void Main(string[] args) { var list = new List<User>(); for (int i = 0; i < 5; i++) { var user = new User { Id = i, Name = i + " user name" }; list.Add(user); } var other = new User { Id = 2, Name = "test 2" }; list.Add(other); var groups = list.GroupBy(u => u);//直接分组 var result = from g in groups select new KeyValuePair<string, User> ( key: g.First().Name, value: g.First() ); //因为User重写了GetHashCode(),所以temp的结果只有5个item var temp = result.ToList(); } } public class User:IEquatable<User> { public int Id { get; set; } public string Name { get; set; } public bool Equals(User other) { return other != null && this.Id == other.Id; } public override int GetHashCode() { return this.Id.GetHashCode(); } } }
如果不想重写GetHashCode(),可以指定属性进行分组
{ class Program { static void Main(string[] args) { var list = new List<User>(); for (int i = 0; i < 5; i++) { var user = new User { Id = i, Name = i + " user name" }; list.Add(user); } var other = new User { Id = 2, Name = "test 2" }; list.Add(other); var groups = list.GroupBy(u => u.Id); var result = from g in groups select new KeyValuePair<string, User> ( key: g.First().Name, value: g.First() ); //结果还是5个 var temp = result.ToList(); } } public class User:IEquatable<User> { public int Id { get; set; } public string Name { get; set; } } }
原文地址:http://my.oschina.net/wower/blog/287984