2012-05-10 5 views
6

Я получил List<MyClass>:C# Expand Плоский список <T> словарю <T, ICollection <int>>

public int MyClass 
{ 
    public int One { get; set; } 
    public int Two { get; set; } 
} 

Теперь данные могут (и делает) выглядит следующим образом:

One : 1, Два: 9

Один: 2, второй: 9

Один: 1, Два: 8

One: 3, два: 7

Посмотрите, как дважды появляется "One"? Я хочу, чтобы эта плоской последовательности в сгруппированной Dictionary<int,ICollection<int>>:

KeyValuePairOne: {Key: 1, Значение: {9, 8}}

KeyValuePairTwo: {Ключ: 2, Значение: {9}}

KeyValuePairThree: {Ключ: 3, Значение: {7}}

Я предполагаю, что мне нужно сделать комбинацию .GroupBy и .ToDictionary?

+0

Вы находитесь в правильном направлении. Что вы пробовали? – SimpleVar

+1

yep, что именно то, что я бы сделал –

+0

@Yorye - я пробовал уродливую петлю, и я знал, что это неправильный способ сделать это, но не знал, как подойти, используя '.GroupBy' и'. ToDictionary' вместе здесь, поэтому я пришел в стек и попросил о помощи. :) – RPM1984

ответ

2
var list = new List<MyClass>(); 

var dictionary = list.GroupBy(x => x.One) 
        .ToDictionary(x => x.Key, x => x.ToArray()); 
+0

правильно, но его фактически 'x => x.Select (y => y.Two) .ToArray()' в '.ToDictionary> ', потому что я хочу закончить с помощью словаря >' not 'Dictionary >' – RPM1984

+0

Мой плохой. Но пока у вас есть решение, я счастлив. – SimpleVar

+0

так я. :) спасибо и согласился. – RPM1984

4

Это то, что ToLookup способ расширения для. Где ToDictionary будет бросать, если ключ появляется дважды, ToLookup вместо этого прекрасно справляется с этим и делает то, что вы ищете.

+0

ToLookup в значительной степени похож на группу GroupBy, которая сама по себе не достаточна для решения вопроса (из него не получается словарь) – SimpleVar

+0

@YoryeNathan это более кратким, чем GroupBy: одна фраза вместо двух. Кроме того, ваш ответ * - это именно то, что * - делать GroupBy - так что, по-видимому, вы считаете, что это достаточно (или, по крайней мере, это лучшее решение). – McGarnagle

+0

GroupBy правильный, но с добавлением ToDictionary. ToLookup с добавлением ToDictionary также работает. Который, кстати, ничуть не короче. Все, что я говорю, это то, что вам все равно понадобится ToDictionary, так как OP хочет словарь. – SimpleVar

0

Это именно то, как вы могли бы сделать это:

Dictionary<int, List<MyClass>> result = 
    items.GroupBy(x => x.One).ToDictionary(x => x.Key, x => x.ToList()); 
+0

ahhh, вот и все ... (я думаю) .. попробуйте сейчас ... – RPM1984

+2

Почему бы не использовать var? Кроме того, .ToArray() также сделает ICollection и будет более эффективным. Вы должны сделать список только в том случае, если вы намереваетесь использовать Add/Remove на ICollection. – SimpleVar

+0

true и true .. – RPM1984

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