首页 > 解决方案 > 计算订单相关列表的出现次数在列表中>

问题描述

有一个类似的问题没有回答我的问题。-->计算列表中的元素个数>

我有一个包含子列表的列表:

List<string> sublist1 = new List<string>() { "a", "b" };
List<string> sublist2 = new List<string>() { "a", "b" };
List<string> sublist3 = new List<string>() { "a", "c" };

现在我想计算每个列表的出现次数。

a, b --> 2
a, c --> 1

distinct()从 LINQ 使用,但我得到了输出:

a, b --> 1
a, b --> 1
a, c --> 1

我假设哈希码是不同的。是否有替代方法distinct()是查看列表值?如果可能的话,我想在 LINQ 中解决这个问题。

编辑:列表项的顺序必须相同!

标签: c#listlinqcountcompare

解决方案


为此GroupBy(),您将需要一个IEqualityComparer<List<string>>比较字符串列表的合适的。没有内置的实现,所以你必须自己动手:

public sealed class StringListEqualityComparer : IEqualityComparer<List<string>>
{
    public bool Equals(List<string> x, List<string> y)
    {
        if (ReferenceEquals(x, y))
            return true;

        if (x == null || y == null)
            return false;

        return x.SequenceEqual(y);
    }

    public int GetHashCode(List<string> strings)
    {
        int hash = 17;

        foreach (var s in strings)
        {
            unchecked
            {
                hash = hash * 23 + s?.GetHashCode() ?? 0;
            }
        }

        return hash;
    }
}

一旦你有了它,你可以使用它GroupBy()如下:

public static void Main()
{
    var sublist1 = new List<string>{ "a", "b" };
    var sublist2 = new List<string>{ "a", "b" };
    var sublist3 = new List<string>{ "a", "c" };

    var listOfLists = new List<List<string>> {sublist1, sublist2, sublist3};

    var groups = listOfLists.GroupBy(item => item, new StringListEqualityComparer());

    foreach (var group in groups)
    {
        Console.WriteLine($"Group: {string.Join(", ", group.Key)}, Count: {group.Count()}");
    }
}

推荐阅读