如何对查找进行排序?

spr*_*t12 8 linq sorting lookup

嗨,我有一个存储字符串和整数的查找类型.

static Lookup<string, int> lookup;
lookup = (Lookup<string, int>)list.ToLookup(i => i.IP, i => i.Number);
Run Code Online (Sandbox Code Playgroud)

但现在我需要通过值(数字)对此查找进行排序,并获得前10个键及其值.

这怎么可能?

Pop*_*lin 5

不幸的是, Lookup 中的元素无法重新排序。

但是 ToLookup() 方法有一个很好的特性,即所有分组中的元素与原始序列中的元素具有相同的顺序。

这意味着通过一些 Linq 体操,您可以通过使用 GroupBy 来实现您想要的:

var l = (from l in list
         // group elements by key
         group l by l.IP into g
         // for each group order the elements and take top 10
         select new { g.Key, Items = g.OrderBy(g1 => g1.Number).Take(10)} into g2
         // flaten group into an enumerable using select many
         from g in g2.Items
         select g)
         // get the desired lookup containing the top 10 ordered elements for each key
        .ToLookup(g => g.IP, g => g.Number);
Run Code Online (Sandbox Code Playgroud)

  • “所有分组中的元素与原始序列中的元素具有相同的顺序” - 很高兴知道这一点。 (2认同)

Rit*_*ton 4

我不确定您为什么将 a 转换Lookup<string, int>为 a Lookup<string, string>,但您想要的一般答案是:

var list = new List<Test>
    {
            new Test { IP = "A", Number = 1 }, new Test { IP = "A", Number = 3 }, new Test { IP = "A", Number = 4 },
            new Test { IP = "B", Number = 1 }, new Test { IP = "B", Number = 1 }, new Test { IP = "B", Number = 1 },
            new Test { IP = "C", Number = 1 },
            new Test { IP = "D", Number = 1 },
            new Test { IP = "E", Number = 1 }, new Test { IP = "E", Number = 1 }, new Test { IP = "E", Number = 1 }
    };

var values = list.ToLookup(s => s.IP, s => s.Number)
                 .OrderByDescending(s => s.Count())
                 .Take(10);
Run Code Online (Sandbox Code Playgroud)