2010-04-07 2 views
2

У меня есть коллекция IEnumerable<sentence> (предложение = строка)IEnumerable <string> => уникальная строка []

Я хочу разделить все предложения на слова (например: .Select(t => t.Split(' ')), и после этого мне нужно сгруппировать этот запрос по слова, чтобы получить список уникальных слов.

Пожалуйста, помогите

ответ

12

Первое предположение:

var uniqueWords = sentences.SelectMany(s => s.Split(' ')).Distinct(); 

Однако, вы, вероятно, хотите, чтобы удалить знаки препинания и перейти в нижний регистр, а также; вы можете сделать это, передав больше символов Split и попросив удалить пустые строки, а затем вызвав ToLowerInvariant на результат.

Если входные предложения получены от SQL, то это будет IQueryable вместо IEnumerable, поэтому Linq попытается выполнить запрос в базе данных, что ограничивает то, что вы можете сделать.

Чтобы Linq выполнить в памяти, что дает вам полную мощь BCL, использование:

var uniqueWords = sentences.AsEnumerable().SelectMany(s => s.Split(' ')).Distinct(); 

Дополнительный вызов AsEnumerable() получает необработанные результаты из базы данных в памяти, так что вы можете выполнить нормальный.

+0

я пытаюсь применить код таблицы (Linq2Sql) вар uniqueWords = m_DataContext.StoreCategories.SelectMany (s => s.Name.Split (»«)) Distinct(). Но есть ошибка - Method 'System.String [] Split (Char [])' не поддерживает перевод на SQL. – Maxim

+0

Я обновил свой ответ. Также я собираюсь соответствующим образом пометить ваш вопрос. –

+0

На этом блоге хороший обзор (с изображениями) о том, как работает SelectMany ... http://www.codethinked.com/post/2010/03/12/A-Visual-Look-At-The-LINQ-SelectMany -Operator.aspx –

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