2013-12-24 2 views
0

У меня возникла следующая проблема с использованием LINQ. Скажем, у меня есть набор чисел в диапазоне от одного до пяти: [1,2,4,5,0,3,1 ...]. В этом массиве может быть любое число. Я хочу преобразовать этот массив в следующую структуру: [{number:0, count:5},{number:1, count:3}, {number:2, count:0}....]. Если я использую GroupBy, я пропустил запись для номера 2. Есть ли элегантный и эффективный способ сделать это с помощью LINQ?Группа по предопределенному набору ключей с использованием LINQ

+1

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

ответ

2

Вам необходимо выполнить внешнее соединение между вашей коллекцией и «фиксированной» коллекцией, содержащей цифры от 0 до 5. Затем группируйте это и делайте подсчет.

+2

Да, это все. В терминах LINQ это будет 'fixedNumbers.GroupJoin (collection, x => x, x => x, (f, s) => new {Number = f, Count = s.Count()});' –

0
var arrayOfNumbers = new int[] {1, 5, 4, 5, 1, 0, 2, 3, 4, 5, 1,1,1}; 
var result = 
    from n in arrayOfNumbers 
    group n by n into g 
    select new { Number = g.Key, Count = g.Count() }; 

foreach (var item in result) 
{ 
    Console.WriteLine(String.Format("Number {0}: count {1}", item.Number, item.Count)); 
} 
0
List<KeyValuePair<string, int>> pairs = new List<KeyValuePair<string,int>>(); 

for(int i = 0; i < 5; i++)    
{ 
    pairs.Add(new KeyValuePair<string, int>("number:" + i, arrayOfNums.Select(x => x == i).Count())); 
} 

Где arrayOfNums это ваш массив значений между 0 и 5. результаты сохраняются в List<KeyValuePair>> в формате, который вы хотите.

Вы можете улучшить это, вместо использования жестко закодированного 5 в цикле, вы можете использовать поиск наивысшего значения в массиве.

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