2014-11-25 3 views
-5

У меня есть список (например, List<int>: 1,2,3,2,1,6,2). Некоторые элементы из них одни и те же, некоторые - нет (т. Е. Существуют разные элементы).Список заказов по количеству каждого элемента

Мне нужно заказать список, сколько раз каждый элемент появляется в списке. Является ли это возможным?

+5

Да, это возможно. Что вы пробовали? – gunr2171

+1

Кроме того, что бы вы хотели, чтобы результат выглядел? – gunr2171

+0

В случае дублирования частоты, какой должен быть ваш вторичный заказ? Численное значение asc/desc? –

ответ

2

Вы можете сделать:

  • группы по каждому пункту
  • заказа по нисходящей на основе подсчета группы
  • выберите уникальный элемент на основе групповой ключ

Как:

List<int> list = new List<int> { 1, 2, 3, 2, 1, 6, 2 }; 
var query = list.GroupBy(item => item) 
       .OrderByDescending(grp => grp.Count()) 
       .Select(grp => grp.Key); 


foreach (var item in query) 
{ 
    Console.WriteLine(item); 
} 

EDIT:

Если вы не хотите, уникальный предмет, но все элементы на основе их возникновения, то используйте:

var query = list.GroupBy(item => item) 
       .OrderByDescending(grp => grp.Count()) 
       .SelectMany(grp => grp); 

SelectMany будет Свести перечислите и выдайте такой вывод, как:

2 
2 
2 
1 
1 
3 
6 
+0

Мое понимание заключается в том, что OP хочет заказать вещи, не устраняя дубликатов. Другими словами, количество элементов, возвращаемых из запроса, должно быть равно количеству входящих элементов, но с использованием определенного порядка, который требуется OP. – dasblinkenlight

+0

@dasblinkenlight, спасибо за это, я добавил код для этого также в своем ответе. – CriketerOnSO

1

Использование GroupBy и OrderBy:

 var list = new[] { 1, 2, 3, 2, 1, 6, 2 }; 
     list.GroupBy(x => x).OrderBy(x => x.Count()).Select(x => x.Key); 
Смежные вопросы