在c#</string>中对类似类型的列表<string>进行分组

时间:2011-06-28 09:00:14

标签: c# list group-by

.GroupBy(x => x) 

.GroupBy用于对类似类型的字符串,int等进行分组。 然后我可以使用什么功能来组合List&lt;串GT;类似的。

2 个答案:

答案 0 :(得分:2)

GroupBy依赖于以适当方式实现Equals / GetHashCode的元素类型。

您的问题不明确,但我的猜测是您希望两个具有相同元素的列表被视为相等。我怀疑您需要编写自己的IEqualityComparer实现,并将其传递给GroupBy。例如(未经测试):

public class ListEqualityComparer<T> : IEqualityComparer<List<T>>
{
    private static readonly EqualityComparer<T> ElementComparer =
        EqualityComparer<T>.Default;

    public int GetHashCode(List<T> input)
    {
        if (input == null)
        {
            return 0;
        }
        // Could use Aggregate for this...
        int hash = 17;
        foreach (T item in input)
        {
            hash = hash *31 + ElementComparer.GetHashCode(item);
        }
        return hash;
    }

    public bool Equals(List<T> first, List<T> second)
    {
        if (first == second)
        {
            return true;
        }
        if (first == null || second == null)
        {
            return false;
        }
        return first.SequenceEqual(second, ElementComparer);
    }
}

您还可以允许每个ListEqualityComparer实例具有单独的每元素比较器,这将允许您以不区分大小写的方式比较(比方说)字符串列表。

答案 1 :(得分:0)

我假设你问的是如何按自定义类型的对象进行分组。

您需要定义对象应如何相互比较 您可以在IEqualityComparer来电中指定GroupBy来执行此操作。

如果未指定IEqualityComparer,则使用IEqualityComparer.Default,检查类型T是否实现System.IEquatable<T>接口,如果是,则返回{{ 1}}使用该实现。否则,它返回EqualityComparer<T>,它使用由EqualityComparer<T>提供的Object.Equals和Object.GetHashCode的覆盖。