2011-12-23 22 views
2

我有五個強類型的List對象。每個List中的每個對象都有屬性RatingVote查找對象裏面收集的對象

如何才能從所有List的對象中僅選擇10個最高評分對象?如果Rating等於然後需要使用Vote

實施例(選擇2頂部評估):

List<Film>

 
0 element: rating = 1, vote = 2; 
1 element: rating = 4, vote = 5; 

List<Clubs>

 
0 element: rating = 5, vote = 3; 
1 element: rating = 4, vote = 3; 

結果:0元件從Clubs和1元件來自Film

+4

是'Rating'和'的Vote'性質界面,電影和俱樂部分享?如果不是這樣,你就會被反射或者(用C#4.0以後的版本)'動態的'。 – AakashM 2011-12-23 09:48:01

+0

如何根據「評級」和「投票」屬性定義「評級」?換句話說,這兩個標準的項目*排序*是什麼? – 2011-12-23 09:52:24

+0

第一次通過評級,如果評級是相等的,然後比較投票 – user348173 2011-12-23 10:06:31

回答

2

如果沒有這些元素類型之間沒有共同的子類,你可以使用LINQ使用項目列表的通用Tuple<int, int, object>(即含有兩個屬性,你有興趣的評價,投票,和原來的元素實例),那麼你可以做一個簡單的查詢挑選排名前10位的元素:

List<A> ax = /* ... */; 
List<B> bx = /* ... */; 
List<C> cx = /* ... */; 
/* ... */ 

IEnumerable<Tuple<int, int, object>> ratingsAndVotes = 
    ax.Select((a) => Tuple.Create(a.Rating, a.Vote, a)).Concat(
    bx.Select((b) => Tuple.Create(b.Rating, b.Vote, b)).Concat(
    cx.Select((c) => Tuple.Create(c.Rating, c.Vote, c)) /* ... */; 
Tuple<int, int, object>[] topTenItems = 
    ratingsAndVotes.OrderByDescending((i) => i.Item1).ThenByDescending((i) => i.Item2).Take(10).ToArray(); 
// topTenItems now contains the top 10 items out of all the lists; 
// for each tuple element, Item1 = rating, Item2 = vote, 
// Item3 = original list item (as object) 
+0

哇,很酷的解決方案,謝謝。 – user348173 2011-12-23 10:24:46

8

嘗試類似下面

VAR TOPTEN = yourList.OrderBy(X => x.Rating).ThenBy(Z => z.Vote)。取(10)

+0

Linq是要走的路:)如果列表很大或耗時,你可以做到並行以及:) – 2011-12-23 09:56:00

+0

非常富有表現力的解決方案。 – Adam 2011-12-23 09:57:37

+0

它只適用於一個系列。需要從5. – user348173 2011-12-23 10:14:56

3

你可以像啓動:

var res = l1.Concat(l2).Concat(l3).Concat(l4).Concat(l5) 
        .OrderByDescending(k => k.Rating) 
        .ThenBy(k=>k.Vote) 
        .Take(10).ToList(); 

其中L1 ... L5您的列表

1

您可以使用排序依據,並通過ThenBy兩個(或多個)字段順序,然後使用以獲得前10名:

var myList = new List<Film>(); 
// ... populate list with some stuff 
var top10 = myList.OrderBy(f => f.Rating).ThenBy(f => f.Vote).Take(10); 

希望幫助:)