2011-10-29 94 views
5

您好我有一個存儲字符串和整數的查找類型。如何對查找進行排序?

static Lookup<string, int> lookup; 
lookup = (Lookup<string, int>)list.ToLookup(i => i.IP, i => i.Number); 

但現在我需要按值(數字)對這個查找進行排序,並獲得前10個鍵的值。

這怎麼可能?

+1

我想明白這一點。你爲什麼把'i.Number'轉換成'string'? – James

+0

嗨,對不起,它應該是int。我現在改變它,當我回家並在今晚嘗試時,我也會回答一個問題。非常感謝所有。 – sprocket12

回答

2

我不知道爲什麼你鑄造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); 
+0

嗨,感謝您做出測試列表的額外努力。 – sprocket12

0

看看Take() LINQ函數,你應該可以做一些事情,如Take(10)只返回10個結果。至於排序,請檢查接受lambda表達式作爲排序機制的OrderBy()函數。將它們結合起來應該會給你你想要的。

1

去找個優先級隊列(你可以找到一個在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)的性能。如果集合不是很大,那麼考慮到它的內置支持並且不需要中間類來支持優先級隊列實現,排序就更簡單了。

+0

嗨,你的回答是正確的,但我不能標記兩個答案是正確的。非常感謝您的幫助。 – sprocket12

2

不幸的是,查找內部的元素無法重新排序。

但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); 
+0

哦,他想要數字前十位而不是前十位?我完全錯過了。 –

+0

「所有分組中的元素與原始序列中的元素具有相同的順序」 - 這很好理解。 – Homer