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; }
}
}