【问题标题】:In C#, what is the best way to test if a dataset is empty?在 C# 中,测试数据集是否为空的最佳方法是什么?
【发布时间】:2008-09-06 21:02:43
【问题描述】:

我知道您可以查看 row.count 或 tables.count,但是还有其他方法可以判断数据集是否为空?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    我建议如下:-

      bool nonEmptyDataSet = dataSet != null && 
        (from DataTable t in dataSet.Tables where t.Rows.Count > 0 select t).Any();
    

    编辑:经过适当考虑,我已经对代码进行了重大清理,我认为这更清洁。非常感谢 Keith 对使用 .Any() 的启发。

    根据 Keith 的建议,这里是这种方法的扩展方法版本:-

    public static class ExtensionMethods {
      public static bool IsEmpty(this DataSet dataSet) {
        return dataSet == null ||
          !(from DataTable t in dataSet.Tables where t.Rows.Count > 0 select t).Any();
        }
      }
    

    请注意,正如 Keith 在他的帖子的 cmets 中正确纠正我的那样,即使数据集为空,此方法也可以工作。

    【讨论】:

    • 哎哟。我想我编辑了太多次了……现在它是一个社区帖子!那好吧。 :-)
    【解决方案2】:

    怎么了

    (aDataSet.Tables.Count == 0)

    ?

    【讨论】:

    • 看来作者将“空数据集”定义为没有表或有任意数量的空表的数据集。
    • 如果您查看原始帖子(单击编辑链接),您会看到已添加“或 tables.count”。在此更改之前,我的问题是明智的......
    • 问题在于,从 2013 年 ASP.NET 4.0 开始,dataSet 可能为 null,在这种情况下检查崩溃
    • 好点,但问题是关于检查数据集是否为空而不是非空。如果您认为这是一个更好的答案,我会添加一个空检查?
    【解决方案3】:

    我为此目的创建了一个小型静态 util 类

    下面的代码应该读起来像一个英文句子。

        public static bool DataSetIsEmpty(DataSet ds)
        {
            return !DataTableExists(ds) && !DataRowExists(ds.Tables[0].Rows);
        }
    
        public static bool DataTableExists(DataSet ds)
        {
            return ds.Tables != null && ds.Tables.Count > 0;
        }
    
        public static bool DataRowExists(DataRowCollection rows)
        {
            return rows != null && rows.Count > 0;
        }
    

    我只想在下面的代码中添加一些内容并完成它。 编写可读代码确实很重要。

            if (DataAccessUtil.DataSetIsEmpty(ds)) {
                return null;
            }
    

    【讨论】:

      【解决方案4】:

      我认为这是一个可以使用 C# 3 中的扩展方法来提高易读性的地方。

      使用 kronoz 的想法...

      public static bool IsNotEmpty ( this dataset ) 
      {
          return dataSet != null && (
              from DataTable t in dataSet.Tables 
              where t.Rows.AsQueryable().Any()
              select t).AsQueryable().Any();
      }
      
      //then the check would be
      DataSet ds = /* get data */;
      
      ds.IsNotEmpty();
      

      由于扩展方法总是由编译器扩展,即使被检查的数据集为空,这也可以工作。

      在编译时会更改:

      ds.IsNotEmpty();
      
      //becomes
      
      DataSetExtensions.IsNotEmpty( ds );
      

      【讨论】:

      • 这是一个好主意,虽然迂腐 t.Rows.Any() 行不会编译,因为 dataSet.Tables.Rows 是一个 DataRowCollection ,它没有实现 IEnumerable 所以。 Any() 不可用。
      • 哦,很抱歉更加可怕,但是当数据集为空时扩展方法将不起作用,而是会引发 NullReferenceException。此外,IsEmpty() 返回的结果与它应该返回的相反 - 它表明它是否 not 为空!!
      • 啊,我不知道。太酷了,谢谢你清理它:-)
      【解决方案5】:

      为了清楚起见,您首先需要查看所有数据表,然后查看每个数据表的行数。

      【讨论】:

        【解决方案6】:
        #region Extension methods
        
        public static class ExtensionMethods
        {
            public static bool IsEmpty(this DataSet dataSet)
            {
                return dataSet == null || dataSet.Tables.Count == 0 || !dataSet.Tables.Cast<DataTable>().Any(i => i.Rows.Count > 0);
            }
        }
        
        #endregion
        

        【讨论】:

        • 这样投然后“手动”检查所有行是个好主意吗?
        猜你喜欢
        • 2011-12-07
        • 2015-09-04
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 2016-09-01
        • 2020-12-08
        相关资源
        最近更新 更多