Как вернуть пустое значение вместо нуля в C # - PullRequest
4 голосов
/ 05 июля 2011

У меня есть расширение для строковых массивов, которое возвращает пустую строку, если массив равен нулю, если длина массива == 1, он возвращает первый элемент, в противном случае возвращается элемент в позиции индекса, проверка границ не выполняется.

public static Strings IndexOrDefault(this String[] arr, Int32 index)
{
    if (arr == null)
        return String.Empty;
    return arr.Length == 1 ? arr[0] : arr[index];
}

Теперь мне нужно расширить эту функциональность на другие массивы, поэтому я подумал, что этот метод расширения может справиться с работой

public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
    if (arr == null)
        return default(T);
    return arr.Length == 1 ? arr[0] : arr[index];
}

И все было в порядке, за исключением того, что default (String) не String.Emptyно ноль.Так что теперь я возвращаю нули для строк, что было первым требованием ...

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

Edit 2 : (первым было определение)

Сейчас я использую этот подход, который работает, но он не так элегантен, как я хотел (ну, метод тоже не элегантный), но решение могло бы :))

public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
    if (arr == null)
        return default(T);
    return arr.Length == 1 ? arr[0] : arr[index];
}

public static String IndexOrDefault(this String[] arr, Int32 index)
{
    if (arr == null)
        return String.Empty;
    return arr.Length == 1 ? arr[0] : arr[index];
}

Два разных метода, один для String и универсальный для остальных.

Ответы [ 6 ]

3 голосов
/ 05 июля 2011

Не существует универсального значения по умолчанию, кроме нуля для ссылочных типов и некоторого варианта 0 для типов значений

Вы можете легко предоставить его, хотя

public static T IndexOrDefault<T>(this T[] arr, Int32 index, T theDefaultValue)
{
    if (arr == null)
        return theDefaultValue;
    return arr.Length == 1 ? arr[0] : arr[index];
}

public static T IndexOrDefault<T>(this T[] arr, Int32 index, Func<T> defaultFactory)
{
    if (arr == null)
        return defaultFactory();
    return arr.Length == 1 ? arr[0] : arr[index];
}
1 голос
/ 05 июля 2011

или первый элемент, если массив не имеет элемента в позиции индекса

Не совсем. Метод возвращает первый элемент, если длина массива равна единице, но вообще не проверяет индекс. То, что вы описываете, будет выглядеть примерно так:

public static Strings IndexOrDefault(this String[] arr, Int32 index) {
  if (arr == null || arr.Length == 0) return String.Empty;
  if (index >= arr.Length) return arr[0];
  return arr[index];
}

Общая версия будет:

public static T IndexOrDefault<T>(this T[] arr, Int32 index) {
  if (arr == null || arr.Length == 0) return default(T);
  if (index >= arr.Length) return arr[0];
  return arr[index];
}

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

Нет, нет способа получить пустое значение для универсального типа. Большинство типов вообще не имеют пустых значений. Например, int не может быть пустым.

0 голосов
/ 05 июля 2011

Что происходит, когда вы возвращаете значение по умолчанию T?

0 голосов
/ 05 июля 2011

Вы можете проверить «специальный» тип string.Кроме того, ваш код не делает то, что вы сказали, что он будет делать - исправлены некоторые крайние условия для вас:

public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
    if (arr == null || arr.Length == 0)
        return default(T);

    return arr.Length <= index ? arr[0] : arr[index];
}
0 голосов
/ 05 июля 2011

Вы можете попытаться вернуть new T() - но вам нужно будет добавить ограничение where T : new к объявлению вашего метода.

В противном случае значение по умолчанию для строки равно нулю.Поэтому следующий вариант - создать перегрузку строки ... Я знаю, что это не лучший вариант, но вы можете справиться с этим.

0 голосов
/ 05 июля 2011

Нет, null - это значение по умолчанию для string. Вам нужно будет либо добавить код, специально проверяющий, когда T является строкой, либо использовать другой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...