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个键及其值.
这怎么可能?
不幸的是, 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)
我不确定您为什么将 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)