我有这个对象:
notes:[
{ user: {
name: "A",
group:{
id:1,
name:"Group 1"
}
},
{ user: {
name: "B",
group:{
id:1,
name:"Group 1"
}
}]
我需要按组进行分组..所以我尝试了这个:
foreach (IGrouping<Group, Note> item in notes.GroupBy(n => n.User.Group))
{
var groupName = item.Key.Name;
foreach (var note in item)
{
//
}
}
但是我遇到了一个问题,因为分组不起作用(我认为这是因为它使用了对复杂类型进行分组的引用)。
如果我将n.User.Group
更改为n.User.GroupId
,则可以正常工作,但如果我这样做,则无法获取群组名称。
答案 0 :(得分:3)
您需要在Group类中重写Equals和GetHashCode。 R#为它生成这种代码:
public class Group
{
public int GroupId { get; set; }
public string Name { get; set; }
protected bool Equals(Group other)
{
return GroupId == other.GroupId;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Group) obj);
}
public override int GetHashCode()
{
return GroupId;
}
}
答案 1 :(得分:3)
Equals(object obj)
&amp;组对象上的GetHasCode()
实现自己的平等IEqualityComparer<Group>
并将其作为GroupBy方法的第3个参数传递。答案 2 :(得分:1)
你有几个选择:
答案 3 :(得分:0)
您可以利用比较匿名类并写为
notes.GroupBy(n => new{n.User.Group.ID,n.User.Group.Name});