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

7

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

6个回答

17
我建议类似这样的内容:-
  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 在他的帖子评论中正确指正我的时候,即使数据集为 null,这种方法也能够发挥作用。

哎呀,我觉得我编辑了太多次这个了……现在它是社区帖子了!哦,算了。 :-) - ljs

5
这是什么问题?
(aDataSet.Tables.Count == 0)这个条件是否成立?

似乎作者将“空数据集”定义为没有表或任意数量的空表的数据集。 - vitule
如果您查看原始帖子(单击编辑链接),您会发现已添加“或表格计数”。在那之前,我的问题是明智的... - Joe Ratzer
问题在于,截至2013年ASP.NET 4.0版本,数据集可能为空,这种情况下检查会崩溃。 - philw
好的观点,但问题是要检查数据集是否为空,而不是非空。如果您认为这是更好的答案,我可以添加一个空值检查吗? - Joe Ratzer

3
我已经创建了一个小的静态工具类,专门用于此目的。
下面的代码应该像英语句子一样读起来。
    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;
        }

2

我认为在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();

由于扩展方法总是由编译器扩展,因此即使要检查的数据集为 null,这也可以正常工作。

在编译时,会进行以下更改:

ds.IsNotEmpty();

//becomes

DataSetExtensions.IsNotEmpty( ds );

这是一个不错的想法,但是要严谨一些,t.Rows.Any() 这行代码无法编译通过,因为 dataSet.Tables.Rows 是 DataRowCollection 类型,它没有实现 IEnumerable<T> 接口,所以 .Any() 方法不可用。 - ljs
哦,还有抱歉要更加严厉地批评一下,当数据集为null时,扩展方法将无法工作,而会引发NullReferenceException异常。此外,IsEmpty()返回的是相反的结果 - 它指示它是否为空!! - ljs
啊,我不知道那个。非常酷,谢谢你澄清了这一点 :-) - ljs

0
#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

将数据类型转换后,再手动检查所有行,这是一个好主意吗? - Kache

0
需要明确的是,您首先需要查看所有的DataTable,然后查看每个DataTable的行数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接