2013-06-21 2 views
2

Я полагаю, что этот вопрос может частично дублировать другие подобные вопросы, но у меня возникают проблемы с такой ситуацией:IEnumerable <string> словарю <гольца, IEnumerable <string>>

Я хочу, чтобы извлечь из некоторых строк предложений

Например, из

`string sentence = "We can store these chars in separate variables. We can also test against other string characters.";` 

Я хочу построить IEnumerable слова;

var separators = new[] {',', ' ', '.'}; 

IEnumerable<string> words = sentence.Split(separators, StringSplitOptions.RemoveEmptyEntries); 

После этого идите Повсеместно все эти words и принять Елки характер в отличие восходящая Упорядоченный набор символов.

var firstChars = words.Select(x => x.ToCharArray().First()).OrderBy(x => x).Distinct(); 

После этого пройти через обе коллекции и для каждого символа в firstChars получить все items от words, который имеет first character равный с current character и создать Dictionary<char, IEnumerable<string>> dictionary.

Я делаю это так:

var dictionary = (from k in firstChars 
        from v in words 
        where v.ToCharArray().First().Equals(k) 
        select new { k, v }) 
        .ToDictionary(x => x); 

и вот проблема: An item with the same key has already been added. Whis потому, что в этот словарь Он собирается добавить существующий характер.

я включил GroupBy расширение в мой запрос

var dictionary = (from k in firstChars 
        from v in words 
        where v.ToCharArray().First().Equals(k) 
        select new { k, v }) 
        .GroupBy(x => x) 
        .ToDictionary(x => x); 

Решение выше, дает делает все ОК, но это дает мне другой тип, чем мне нужно.

enter image description here Что я должен сделать, чтобы получить в результате кDictionary<char, IEnumerable<string>>dictionaryно неDictionary<IGouping<'a,'a>>?

Результат, который я хочу, как в изображении ниже: enter image description here Но здесь я должен перебирать с 2 Еогеасп (ов), который будет показывать мне Ват я хочу ... Я не могу хорошо понять, как это происходит .. .

Любые предложения и советы будут приветствоваться. Спасибо.

+0

Зачем вам писать 'x.ToCharArray(). Сначала()' вместо 'x [0]'? И почему вы используете 'Equals()' вместо '=='? – svick

+0

@svic, это тривиальное решение 'x.ToCharArray(). First()' или 'x [0]' :) 'Equals()' вместо '==' также имеет несущественную значимость. Большая проблема в том, что мне нужен результат 'Dictionary >'. Все ответы перенаправляют меня из словаря на 'ILookup'. Я пытался что-то сделать по предложениям мальчика, но, похоже, я все еще сталкиваюсь с проблемами. Мне не нужно печатать результат на консоли, но отправить этот словарь другому получателю, который требует словаря > 'на входе :) – meorfi

+0

Одна вещь, которую я понял: вы просите персонажей по возрастанию заказать в «Словаре». За исключением того, что это невозможно, 'Dictionary' не имеет никакого порядка на его клавишах. – svick

ответ

2

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

var words = ... 
var dictionary = words.GroupBy(w => w[0]) 
         .ToDictionary(g => g.Key, g => g.AsEnumerable()); 

Но дело, почему бы не использовать ILookup?

var lookup = words.ToLookup(w => w[0]); 
+0

Я согласен с первой частью ответа, спасибо. Необходимым результатом является словарь >, но не ILookup, потому что я пошлю этот словарь другому получателю, для которого требуется словарь > на входе :) – meorfi

+1

@meorfi. Я думаю, если ваш получатель не хочет * добавлять/удалять элементы из словаря, вероятно, он должен быть реорганизован для использования более простого интерфейса, но все работает :) - счастливое кодирование. –

+0

Я также подумаю о рефакторинге. Спасибо вам за предложение – meorfi

3

В отношении один ко многим, вы можете использовать поиск вместо словаря:

var lookup = words.ToLookup(word => word[0]); 

loopkup['s'] -> store, separate... as an IEnumerable<string> 

И если вы хотите, чтобы отобразить ключ/значения отсортированные по первому полукокса:

for (var sortedEntry in lookup.OrderBy(entry => entry.Key)) 
{ 
    Console.WriteLine(string.Format("First letter: {0}", sortedEntry.Key); 
    foreach (string word in sortedEntry) 
    { 
    Console.WriteLine(word); 
    } 
} 
+0

Это определенно лучшая идея, чем мое предложение. +1 – spender

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