Выберите отдельный список слов из массива с помощью LINQ

Попробуйте этот вариант, я лично его использую:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 
10
задан DaveDev 14 February 2010 в 11:26
поделиться

4 ответа

В вашем примере каждая Объект Word отличается , потому что нет сравнения, которое смотрит на свойство Text.

Однако нет причин создавать новый объект:

var distinctWords = (from w in split 
                      select w).Distinct().ToList(); 

Или проще:

var distinctWords = new List<string>(split.Distinct());
23
ответ дан 3 December 2019 в 16:29
поделиться

Проблема в том, что вы создаете несколько объектов Word, содержащих одно и то же значение, но как компилятор должен знать, что это должны быть одинаковые элементы?

Попробуйте

(from w in split.Distinct()
select new Word { Text = w.ToString()}).ToList();
1
ответ дан 3 December 2019 в 16:29
поделиться

Вы не разместили код для своего класса Word , но я предполагаю, что он не реализует Equals со сравнением значений, поэтому вы получаете реализацию по умолчанию Equals , которая просто проверяет ссылки на объекты. Обратите внимание, что если вы решите реализовать свою собственную версию Equals , вам также необходимо правильно реализовать GetHashCode .

Альтернативный способ решения этой проблемы - предоставить IEqualityComparer в качестве параметра функции Distinct .

1
ответ дан 3 December 2019 в 16:29
поделиться

Как отметили другие, проблема, вероятно, в том, что ваш объект Word не реализует структурное равенство (сравнивается фактическое содержимое, а не ссылки на экземпляр). Если вы по-прежнему хотите получить в качестве результата коллекцию объектов Word, но использовать Distinct для базовых строковых значений, вы можете написать следующее:

IEnumerable<Word> distinctWords = 
   (from w in split.Distinct() 
    select new Word { Text = w.ToString() }).ToList(); 
0
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: