C# LINQ在列表中获取不同的计数/排序
我有一个列表,其中包含一个列表,我需要从列表中确定唯一计数您可以编写自己的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-1C# 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并使用它覆盖列表的比较方式。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}");
}