Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ在列表中获取不同的计数/排序_C#_List_Linq_Count_Nested - Fatal编程技术网

C# LINQ在列表中获取不同的计数/排序

C# LINQ在列表中获取不同的计数/排序,c#,list,linq,count,nested,C#,List,Linq,Count,Nested,我有一个列表,其中包含一个列表,我需要从列表中确定唯一计数您可以编写自己的IEqualityComparer,并将其与GroupBy一起使用 1-a、b、c-3 2-a,b-2 3-d,e,f-1 您可以编写自己的IEqualityComparer,并与GroupBy一起使用 1-a、b、c-3 2-a,b-2 3-d,e,f-1 您是否尝试实现IEqualityComparer并使用它覆盖列表的比较方式。LINQ中的Distinct方法有一个重载,它接受IEqualityComparer,您可

我有一个列表,其中包含一个列表,我需要从列表中确定唯一计数您可以编写自己的IEqualityComparer,并将其与GroupBy一起使用

1-a、b、c-3

2-a,b-2

3-d,e,f-1

您可以编写自己的IEqualityComparer,并与GroupBy一起使用

1-a、b、c-3

2-a,b-2

3-d,e,f-1


您是否尝试实现IEqualityComparer并使用它覆盖列表的比较方式。LINQ中的Distinct方法有一个重载,它接受IEqualityComparer,您可以使用它来提供自定义比较,从而将每个列表视为相同的。-我最近在VB中回答了一个不同的相关问题,但应该很容易遵循这些步骤-@fabric。以及此处需要的GroupBy。您是否尝试实现IEqualityComparer并使用它覆盖列表的比较方式。LINQ中的Distinct方法有一个重载,它接受IEqualityComparer,您可以使用它来提供自定义比较,从而将每个列表视为相同的。-我最近在VB中回答了一个不同的相关问题,但应该很容易遵循这些步骤-@fabric。还有这里需要的GroupBy。你不能这样获得排名。即使您不想这样做,在这里创建没有StringArrayValueComparer的dictionary也没有多大意义。@AntonínLejsek我已经更改了代码,使生成的类型看起来更像问题中描述的类型。您删除了问题,但我还是会回答它。未定义字典中项目的顺序。虽然它实际上经常保持秩序,并且可能通过一些测试,但不能保证它总是这样。如果你没有明确地存储等级,顺序就会丢失,因为它没有可靠地存储在任何地方。@AntonínLejsek我不知道这一点。谢谢你告诉我你不是这样得到排名的。即使您不想这样做,在这里创建没有StringArrayValueComparer的dictionary也没有多大意义。@AntonínLejsek我已经更改了代码,使生成的类型看起来更像问题中描述的类型。您删除了问题,但我还是会回答它。未定义字典中项目的顺序。虽然它实际上经常保持秩序,并且可能通过一些测试,但不能保证它总是这样。如果你没有明确地存储等级,顺序就会丢失,因为它没有可靠地存储在任何地方。@AntonínLejsek我不知道这一点。谢谢你告诉我
public class StringArrayValueComparer : IEqualityComparer<List<string>>
{
    public bool Equals(List<string> x, List<string> y)
        => x.SequenceEqual(y);

    public int GetHashCode(List<string> obj)
        => obj.Aggregate(1, (current, s) => current * 31 + s.GetHashCode());
}

var list = new List<List<string>>(new[]
{
    new List<string>(new [] { "a", "b", "c" }),
    new List<string>(new [] { "d", "e", "f" }),
    new List<string>(new [] { "a", "b" }),
    new List<string>(new [] { "a", "b", "c" }),
    new List<string>(new [] { "a", "b", "c" }),
    new List<string>(new [] { "a", "b" })
});

var orderedList = list
    .GroupBy(x => x, x => x, (x, enumerable) => new { Key = x, Count = enumerable.Count()}, new StringArrayValueComparer())
    .OrderByDescending(x => x.Count)
    .Select((x, index) => new { Rank = index + 1, Combination = x.Key, Frequency = x.Count });

foreach (var entry in orderedList)
{
    Console.WriteLine($"{entry.Rank} - {string.Join(",", entry.Combination)} - {entry.Frequency}");
}