2011-12-23 24 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); 

希望帮助:)