#c# #linq #linq-to-sql
#c# #linq #linq-to-sql
Вопрос:
У меня есть коллекция IEnumerable<sentence>
(предложение = строка)
Я хочу разбить все предложения на слова (например: .Select(t => t.Split(' ')
), и после этого мне нужно сгруппировать этот запрос по словам, чтобы получить список уникальных слов.
Пожалуйста, помогите
Ответ №1:
Первое предположение:
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()
возвращает необработанные результаты из базы данных в память, так что вы можете продолжить работу в обычном режиме.
Комментарии:
1. я пытаюсь применить ваш код к таблице (linq2sql) с переменным uniqueWords = m_DataContext.StoreCategories. Выберите множество(s => s.Name. Разделить(‘ ‘)). Distinct(); Но есть ошибка — Метод ‘System. Строка[] Split(Char[])’ не имеет поддерживаемого перевода в SQL.
2. Я внес обновление в свой ответ. Также я собираюсь соответствующим образом пометить ваш вопрос.
3. В этом блоге есть хороший обзор (с изображениями) того, как работает SelectMany … codethinked.com/post/2010/03/12 /…