在C#中,测试数据集是否为空的最佳方法是什么?

时间:2020-03-05 18:48:47  来源:igfitidea点击:

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

解决方案

回答

怎么了

(aDataSet.Tables.Count == 0)

回答

为了清楚起见,我们首先需要查看所有DataTable,然后查看每个DataTable的行数。

回答

我建议类似的东西:

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在其帖子的评论中正确地纠正了我一样,即使数据集为空,此方法也将起作用。

回答

我为此创建了一个小的静态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;
        }

回答

我认为在这里可以在C3中使用扩展方法来提高可读性。

使用克罗诺兹的想法...

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