В C#, что состоит в том, чтобы протестировать лучший способ, если набор данных пуст?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

7
задан RTipton 6 September 2008 в 21:28
поделиться

5 ответов

Я предложил бы что-то как:-

  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 справедливо исправил меня на в комментариях его сообщения, этот метод будет работать, даже когда набор данных является пустым.

17
ответ дан 6 December 2019 в 06:38
поделиться

Что случилось с

(aDataSet. Таблицы. Количество == 0)

?

5
ответ дан 6 December 2019 в 06:38
поделиться

Я думаю, что это - место, где Вы могли использовать дополнительный метод в 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 );
2
ответ дан 6 December 2019 в 06:38
поделиться

Чтобы быть ясными, необходимо было бы сначала посмотреть на весь DataTables и затем посмотреть на количество строк для каждого DataTable.

0
ответ дан 6 December 2019 в 06:38
поделиться

Я создал маленький статический 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;
        }
3
ответ дан 6 December 2019 в 06:38
поделиться