按集合分组作为关键

时间:2016-03-12 01:01:00

标签: c# .net linq

我有这样的课程:

public class EntityIdentifier
{
    int Id { get; set; }
    int EntityId { get; set; }
    int SourceId { get; set; }

    ICollection<BaseEntityIdentifierDetail> IdentifierValues { get; set; }
}

EntityIdentifier包含一个keyvalue对列表(IdentifierValues)。

然后我有一个EntityIdentifier列表,我想通过IdentifierValues属性进行分组。

var allIds = myIdentifiers.GroupBy(i => i.IdentifierValues);

它编译,但我不确定它会如何表现。我的猜测是我必须在某处实现一些覆盖(比如Equal和GetHashCode),以便可以正确地将对象列表用作分组键。

任何人都知道要将一个集合正确地用作分组键,该实现了什么?

编辑1:要使两个EntityIdentifier相等,它们的键值对(IdentifierValues)必须全部相同。例如。所有相同的键与相同的值和相同大小的列表相关联。

编辑2:IdentifierValues的代码:

public class BaseEntityIdentifierDetail
{
    public int Id { get; set; }
    public string Key { get; set; }
    public string Value { get; set; }
}

1 个答案:

答案 0 :(得分:1)

您应该实现IEqualityComparer<T>界面。然后使用GroupBy()方法,该方法使用定义的IFormatter类。

IEqualityComparer<T>

用法:

public class ColectionBaseEntityIdentifierDetailComparer 
  : IEqualityComparer<ICollection<BaseEntityIdentifierDetail>>
{
    public bool Equals(ICollection<BaseEntityIdentifierDetail> left,
      ICollection<BaseEntityIdentifierDetail> right)
    {
        // compare left and right
        return true;
    }

    public int GetHashCode(ICollection<BaseEntityIdentifierDetail> obj)
    {
        // return correctly implemented GetHashCode()
        return 1; 
    }
}