【问题标题】:C# - Check for null values in IEnumerable<T> of different typesC# - 检查不同类型的 IEnumerable<T> 中的空值
【发布时间】:2019-10-20 00:24:25
【问题描述】:

如何检查 IEnumerable&lt;T&gt; 上的空值,其中 T 可以是引用类型或 Nullable&lt;T&gt; 类型?

我在一个可以是IEnumerable&lt;string&gt;IEnumerable&lt;bool?&gt;IEnumerable&lt;int?&gt;IEnumerable&lt;Guid?&gt; 等的方法中收到object 参数(它也可以是非集合类型......因此object类型)。我需要检查空值。

所以我尝试了value is IEnumerable&lt;object&gt; objValue &amp;&amp; objValue.Contains(null) 之类的方法,但这仅适用于引用类型。当它是 Nullable&lt;&gt; 时,它不起作用,因为值类型缺乏协方差。

有没有一种方法可以解决这个问题而不需要大量的反思?

【问题讨论】:

    标签: c# .net collections


    【解决方案1】:

    我会让你当前的方法只处理非集合类型。创建一个接受 IEnumerable 的新方法来处理检查集合。

    至于检查空值,为什么不直接执行 x == null 或 Object.Equals(x, null) ?

    【讨论】:

      【解决方案2】:

      您可以为您需要的每种情况使用自己的重载方法。

      public void DoSomethingWith(IEnumerable<string> values)
      {
          var notNullValues = values.Where(value => value != null).ToArray();
      
          // Do something with not null values
      }
      
      public void DoSomethingWith(IEnumerable<Nullable<T>> values)
      {
          var notEmptyValues = values.Where(value => value.HasValue).ToArray();
      
          // Do something with not null values
      }
      

      【讨论】:

        【解决方案3】:

        一种相当简单的方法是利用IEnumerable&lt;T&gt; 接口继承非泛型IEnumerable 接口这一事实:

        value is IEnumerable enumerable && enumerable.Cast<object>().Contains(null)
        

        然而,这是一个相当低效的实现,因为值类型集合中的所有项都将被装箱,即使它们不可为空,这可能是一个性能问题,具体取决于集合的大小和执行此代码的频率.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-22
          • 2015-06-25
          • 1970-01-01
          • 2022-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多