2010-11-17 3 views
2

То, что я пытаюсь сделать, это выяснить результат голосования с помощью linq. У каждого пользователя есть идентификатор пива, который является пивом, за которое они проголосовали, или null, если они не голосовали. Я чувствую, что это должно быть просто, но для моей жизни я не могу понять это прямо сейчас. Есть ли быстрый способ использования linq, чтобы я мог получить счет каждого уникального пивного диска, а затем получить тот, у кого больше всего голосов?Как получить отдельный счетчик поля с помощью linq?

+0

Не могли бы вы после того, что ваша модель выглядит как (то есть классы, которые представляют пользователь/голос/Бирс)? Это было бы очень полезно! – Pwninstein

ответ

2
Users 
    .GroupBy(u => u.beerID) 
    .Select(g => new {beerId = g.Key, count = g.Count()}) 
    .OrderByDescending(x => x.count) 
    //.FirstOrDefault() 
+0

Право на! Вот именно то, что мне нужно спасибо! – Mike

2

Группировка, вероятно, лучшая ставка - группируйте голоса по идентификатору пива, а затем подсчитывайте элементы в каждой группе. Что-то вроде этого, например:

var beerCounts = from vote in votes 
       where vote.BeerID != null 
       group vote by vote.BeerID into beerVoteGroups 
       select new 
       { 
        Count = beerVoteGroups.Count(), 
        BeerID = beerVoteGroups.Key 
       }; 

foreach (var group in beerCounts) 
{ 
    Console.WriteLine("Beer {0} got {1} votes", group.BeerID, group.Count); 
} 

Получение максимального количества голосов может быть выполнено путем заказа результатов. Вот модифицированный запрос, который сортирует пиво на сколько голосов получено, начиная с победителя.

var beerCounts = from vote in votes 
       where vote.BeerID != null 
       group vote by vote.BeerID into beerVoteGroups 
       let voteCount = beerVoteGroups.Count() 
       orderby voteCount descending 
       select new 
       { 
        Count = voteCount, 
        BeerID = beerVoteGroups.Key 
       }; 

Вы могли бы выбрать победитель с помощью LINQ первого оператора, например .:

var winner = beerCounts.First(); 
+0

Столь же удивительный! Спасибо Ян – Mike

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