代码之家  ›  专栏  ›  技术社区  ›  Jimson James

LINQ-避免向HashSet添加空值

  •  0
  • Jimson James  · 技术社区  · 6 年前

    如何避免添加空( IsNullOrEmpty p.Trim() ?

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

    变量声明仅用于说明目的。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Dai    6 年前

    FWIW,我建议避免使用 List.ForEach ,请参见埃里克的博客: https://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/

    • ToList
    • 您也可以使用 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();
    

    但如果你真的想 作为最终结果,您可以省略 .Distinct 步骤(确保不要打电话 托利斯特 !):

    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 );
    

    哈希集 接受自定义比较器的构造函数。

        2
  •  0
  •   Hossein    6 年前

    value.Select(s => !string.IsNullOrWhiteSpace(s)).ToList()
          .ForEach(i => values.UnionWith(Array.ConvertAll(i.Split(';'), p => p.Trim())));