您好我有一個存儲字符串和整數的查找類型。如何對查找進行排序?
static Lookup<string, int> lookup;
lookup = (Lookup<string, int>)list.ToLookup(i => i.IP, i => i.Number);
但現在我需要按值(數字)對這個查找進行排序,並獲得前10個鍵的值。
這怎麼可能?
您好我有一個存儲字符串和整數的查找類型。如何對查找進行排序?
static Lookup<string, int> lookup;
lookup = (Lookup<string, int>)list.ToLookup(i => i.IP, i => i.Number);
但現在我需要按值(數字)對這個查找進行排序,並獲得前10個鍵的值。
這怎麼可能?
我不知道爲什麼你鑄造Lookup<string, int>
到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);
嗨,感謝您做出測試列表的額外努力。 – sprocket12
看看Take()
LINQ函數,你應該可以做一些事情,如Take(10)
只返回10個結果。至於排序,請檢查接受lambda表達式作爲排序機制的OrderBy()
函數。將它們結合起來應該會給你你想要的。
去找個優先級隊列(你可以找到一個在http://www.itu.dk/research/c5/)。遍歷查找,並將查找中每個條目創建的IComparable項插入優先級隊列。從優先級隊列中選擇前十項。或者只是把計數作爲關鍵。
var lookup = list.ToLookup(l => l.IP, l => l.Number);
var topten = lookup.OrderByDescending(l => l.Count())
.Take(10);
foreach (var item in topten)
{
Console.WriteLine("{0}: {1}", item.Key, item.Count());
}
注意,排序將在最好的O(nlogn)的性能,同時良好的,基於堆的優先級隊列將有O(LOGN)的性能。如果集合不是很大,那麼考慮到它的內置支持並且不需要中間類來支持優先級隊列實現,排序就更簡單了。
嗨,你的回答是正確的,但我不能標記兩個答案是正確的。非常感謝您的幫助。 – sprocket12
不幸的是,查找內部的元素無法重新排序。
但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);
哦,他想要數字前十位而不是前十位?我完全錯過了。 –
「所有分組中的元素與原始序列中的元素具有相同的順序」 - 這很好理解。 – Homer
我想明白這一點。你爲什麼把'i.Number'轉換成'string'? – James
嗨,對不起,它應該是int。我現在改變它,當我回家並在今晚嘗試時,我也會回答一個問題。非常感謝所有。 – sprocket12