繁体   English   中英

LINQ 在列表中获取不同的计数/排序<List<string> &gt;

[英]LINQ to get Distinct Count/Sort in List<List<string>>

我有一个List<> ,其中包含一个List<string> ,其中我需要从List<string确定唯一计数,并按计数频率排序。

示例:

  • “a”、“b”、“c”
  • “d”、“e”、“f”
  • “一”,“乙”
  • “a”、“b”、“c”
  • “a”、“b”、“c”
  • “一”,“乙”

这将输出(等级/组合/频率)

  • 1 - "a", "b", "c" - 3
  • 2 - "a", "b" - 2
  • 3 "d", "e", "f" - 1

我可以想出一种蛮力方法,但可以用 LINQ 更优雅地完成吗? 据我所知,这并不完全是笛卡尔方法。

谢谢。

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

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}");
}

1 - a,b,c - 3

2 - a,b - 2

3 - d,e,f - 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM