IEnumerable => уникальная строка[]

#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 /…