LINQ - избегайте добавления пустых значений в HashSet - PullRequest
0 голосов
/ 05 сентября 2018

Как мне не добавлять пустое (IsNullOrEmpty) значение в список в приведенном ниже linq после p.Trim()?

    HashSet<string> values;
    string[] value;
    ...  


    get { ... }
    set
    {
        value.ToList().ForEach(i => values.UnionWith(Array.ConvertAll(i.Split(';'), p => p.Trim())));
    }

объявления переменных приведены только для иллюстрации.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

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, которые принимают пользовательский компаратор.

0 голосов
/ 05 сентября 2018

Попробуйте это:

value.Select(s => !string.IsNullOrWhiteSpace(s)).ToList()
      .ForEach(i => values.UnionWith(Array.ConvertAll(i.Split(';'), p => p.Trim())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...