2011-12-23 6 views
2

У меня есть пять прочных объектов List. Каждый объект внутри каждого List имеет свойство Rating и Vote.Найти объект внутри коллекции списка

Как выбрать только 10 самых рейтинговых объектов из всех объектов List? если 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 и далее) 'dynamic'. – AakashM

+0

Как вы определяете «рейтинг» в терминах свойств «Рейтинг» и «Голосование»? Другими словами, что такое * порядок * элементов по этим двум критериям? –

+0

сначала Оценка, если рейтинг равен, тогда сравните ГОЛОСУЕМ – user348173

ответ

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

wow, классное решение, спасибо. – user348173

8

Попробуйте что-то вроде ниже

вар TOPTEN = yourList.OrderBy (х => x.Rating) .ThenBy (г => z.Vote) .Снять (10)

+0

Linq - это путь :) и если список большой или требует много времени, вы можете сделать это параллельно :) –

+0

очень выразительное решение. – Adam

+0

это только для одной коллекции. Нужно взять с 5. – user348173

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

Вы можете использовать OrderBy и ThenBy заказать два (или более) полей, а затем использовать Take, чтобы получить 10 верх:

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

Надежда, что помогает :)

Смежные вопросы