FWIW, я рекомендую избегать использования List.ForEach
, см. Сообщение Эрика в блоге об этом здесь: https://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/
- Вы можете упростить свой код, вам не нужно вызывать
ToList
, если вы собираетесь добавить методы Linq в цепочку вызовов, потому что это приведет к ненужной дополнительной итерации по списку.
- Вы также можете использовать конструктор
HashSet<T>(IEnumerable<T>)
и просто передать созданный Linq IEnumerable<T>
(исходные данные будут повторяться только один раз).
- Если вам просто нужны разные значения, в любом случае вам не нужно использовать
HashSet
, вы можете использовать метод .Distinct()
Линка.
- Я преобразовал ваш
Array.ConvertAll(i.Split(';'), p => p.Trim())
в .SelectMany
звонок.
Мой подход, если вы просто хотите получить список различных строк:
String[] stringValues = ...
List<String> distinctValues = stringValues
.SelectMany( v => v.Split(';') )
.Select( v => v.Trim() )
.Where( v => !String.IsNullOrEmpty( v ) )
.Distinct()
.ToList();
Но если вам нужен HashSet
в качестве конечного результата, вы можете пропустить шаг .Distinct
(убедитесь, что вы не вызываете ToList
!):
String[] stringValues = ...
IEnumerable<String> allValues = stringValues
.SelectMany( v => v.Split(';') )
.Select( v => v.Trim() )
.Where( v => !String.IsNullOrEmpty( v ) );
HashSet<String> asHashSet = new HashSet<String>( allValues );
Если вы хотите сравнение без учета регистра или другую логику сравнения, используйте другие перегрузки конструктора HashSet
, которые принимают пользовательский компаратор.