【问题标题】:IsNullOrEmpty equivalent for Array? C#NullOrEmpty 是否等效于 Array? C#
【发布时间】:2011-12-19 10:40:06
【问题描述】:

.NET 库中是否有一个函数可以返回 true 或 false 来判断数组是 null 还是空? (类似于string.IsNullOrEmpty)。

我在 Array 类中查看了类似这样的函数,但什么也没看到。

var a = new string[]{};
string[] b = null;
var c = new string[]{"hello"};

IsNullOrEmpty(a); //returns true
IsNullOrEmpty(b); //returns true
IsNullOrEmpty(c); //returns false

【问题讨论】:

  • if (arr != null && arr.Length != 0) 有什么问题?或者,如果您需要重复使用它,请创建一个扩展方法。
  • @CodyGray 对于字符串有同样的问题,你不想到处这样做。
  • @CodyGray - 我同意,但我可以看到如果你不得不重复写它会变得很痛苦。在我的大多数项目中,我都有一个扩展方法可以做到这一点。
  • @CodyGray - 不同之处在于扩展方法意味着输入 2 或 3 个字符,然后使用 IntelliSense 自动完成。你必须写完整的if (arr != null && arr.Length != 0)
  • @Yuriy:不,据我所知,那里没有进行任何特殊优化。首先,编译器在 C# 中做的优化很少。几乎所有优化都由 JITer 在运行时处理。是的,JITer 很可能会内联这么短的方法,但不能保证。但是即使发生这种情况,方法调用和上面的代码也没有区别。 IsNullOrEmpty 方法内部没有什么神奇之处——它只是为了方便起见。 JITer 的早期版本实际上在正确优化方面存在问题。

标签: c# arrays


【解决方案1】:

目前还没有,但你可以使用这个扩展方法:

/// <summary>Indicates whether the specified array is null or has a length of zero.</summary>
/// <param name="array">The array to test.</param>
/// <returns>true if the array parameter is null or has a length of zero; otherwise, false.</returns>
public static bool IsNullOrEmpty(this Array array)
{
    return (array == null || array.Length == 0);
}

只需将它放在某个扩展类中,它就会扩展 Array 以获得 IsNullOrEmpty 方法。

【讨论】:

  • 给定任何一个变量(a、b 或 c)你能证明它的用法吗?我能看到它工作的唯一方法是 new Array().IsNullOrEmpty(a);
  • 不需要括号。此外,您还覆盖了在空实例上调用方法时发生的正常行为,因此我将一些 xml cmets 用于智能感知。
  • @YuriyFaktorovich - 是的,括号只是一种习惯。如果我在没有它们的情况下结合逻辑,我会觉得很奇怪。你对 null 行为是正确的,所以我会更新。
  • @maxp - 这是一种扩展方法。你直接在对象上调用它,比如a.IsNullOrEmpty()。见:msdn.microsoft.com/en-us/library/bb383977.aspx
  • 如果在可能为空的引用上调用扩展方法真的很麻烦,您也可以使用语法ExtensionClass.IsNullOrEmpty(arr)(这是编译器实际上正在做的事情),但这不是正常的方式使用扩展方法。
【解决方案2】:

您可以创建自己的扩展方法:

public static bool IsNullOrEmpty<T>(this T[] array)
{
    return array == null || array.Length == 0;
}

【讨论】:

  • 我实际上比我更喜欢这个答案:)
  • @Polynomial 哪个版本的 .net?简单地做new int[0].IsNullOrEmpty&lt;int&gt;() 会为我抛出异常。但这适用于你的。现在,如果您以任何其他方式声明它,它就可以正常工作。
  • @YuriyFaktorovich - 在 Win7 x64 上运行 .NET 4.0.30319,无论我使用 &lt;int&gt; 还是让编译器推断类型都可以正常工作。
  • 没关系,现在它出于某种原因可以使用。我想我犯了一些错误。
  • @YuriyFaktorovich - 这个评论可能有点晚了,但我认为你缺少括号;即(new int[0]).IsNullOrEmpty&lt;int&gt;();
【解决方案3】:

在 VS 2015 中引入 Null-conditional Operator,相反的 IsNotNullOrEmpty 可以是:

if (array?.Length > 0) {           // similar to if (array != null && array.Length > 0) {

IsNullOrEmpty 版本由于运算符优先级而看起来有点难看:

if (!(array?.Length > 0)) {

【讨论】:

    【解决方案4】:

    如果您使用ICollection&lt;T&gt;,则更通用:

    public static bool IsNullOrEmpty<T> (this ICollection<T> collection)
    {
        return collection == null || collection.Count == 0;
    }
    

    【讨论】:

      【解决方案5】:

      这是(当前)投票结果的更新 C# 8 版本

      public static bool IsNullOrEmpty<T>([NotNullWhen(false)] this T[]? array) =>
          array == null || array.Length == 0;
      

      【讨论】:

      【解决方案6】:

      如果你像

      一样初始化了你的数组
      string[] myEmpytArray = new string[4];
      

      然后检查你的数组元素是否为空使用

      myEmpytArray .All(item => item == null)
      

      试试

       public static bool IsNullOrEmpty<T> (this ICollection<T> collection)
       {
          if (collection == null || collection.Count == 0)
              return true;
          else
             return collection.All(item => item == null);
       }
      

      【讨论】:

        【解决方案7】:

        您也可以在创建扩展方法时使用Any

        public static bool IsNullOrEmpty<T>(this T[] array) where T : class
            {
                return (array == null || !array.Any());
            }
        

        不要忘记在您的 using 语句中添加 using System.Linq;

        【讨论】:

          【解决方案8】:
          if (array?.Any() != true) { ... }
          
          • 别忘了拥有using System.Linq;
          • 注意必须明确比较true,因为基础类型是bool?

          【讨论】:

            【解决方案9】:

            不,但您可以自己编写它作为扩展方法。或者你自己库中的静态方法,如果你不喜欢调用 null 类型的方法。

            【讨论】:

              【解决方案10】:

              使用 C# Linq 简化了对 null、空或长度的检查。使用空合并运算符,可以简单地做到这一点:

              if (array?.Any())
                  return true;
              else return false;
              

              【讨论】:

              • "不能隐式转换'bool?'到“布尔””
              【解决方案11】:

              从 C# 6.0 开始,可以使用空传播运算符来表达简洁如下:

              if (array?.Count.Equals(0) ?? true)
              

              注意 1: ?? false 是必需的,因为 following reason

              注意 2: 作为奖励,声明 is also "thread-safe"

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-12-20
                • 1970-01-01
                • 1970-01-01
                • 2012-06-30
                相关资源
                最近更新 更多