Как зацикливается на DataRowCollection таблицы набора данных без проверки нуля

Я работаю с набором данных, который уже заполнен. Я перебираю строки в таблице примерно так:

foreach (DataRow row in this.dataSet.Tables["tablename"].Rows)
{
    // do something
}

это работает нормально, если нет строк, в этом случае нет таблицы, поэтому я получаю ошибку стиля "объект не установлен как экземпляр объекта". (т. е. this.dataSet.Tables["tablename"] имеет значение null, так что я фактически вызываю null.Rows, что, конечно, не работает).

Чтобы обойти это, я делаю:

if (this.dataSet.Tables.Contains("tablename"))
{
    foreach (DataRow row in this.dataSet.Tables["tablename"].Rows)
    {
        // do something
    }
}

что, откровенно говоря, безобразно, как грех. Я предполагаю, что это потому, что.net возвращает ноль, а не нулевой объект.

Есть ли способ, которым я могу просто зациклить строки таблицы, что если таблица не существует, зацикливается на пустой коллекции?

1 ответ

Решение

Нет, ты не можешь. Лучшее, что вы можете сделать, это скрыть проверку в методе расширения.

Если таблица существует, вернуть строки таблицы, в противном случае вернуть пустую последовательность.

public static class DataSetExtensions
{
    public static IEnumerable<DataRow> RowsOfTable(this DataSet dataSet, string tableName)
    {
        if (dataSet.Tables.Contains(tableName))
            return dataSet.Tables[tableName].AsEnumerable();
        return Enumerable.Empty<DataRow>();
    }
}

Тогда используйте это как

DataSet dataSet = new DataSet();
foreach (DataRow row in dataSet.RowsOfTable("tablename"))
{
    // do something
}
Другие вопросы по тегам