Создать массив строк и проверить наличие нулевых значений в C #? - PullRequest
3 голосов
/ 03 февраля 2011

Я создаю строковый массив со значениями из пользовательского объекта, например:

foreach(MyObject o in MyObjectList)
    string[] myArray = new string[] {o.id, o.number.toString(), o.whatever, ...}

Проблема здесь в том, что любое из этих значений может быть NULL, что, конечно, приводит к сбою кода.Допустим, o.number равен NULL, а остальное нет ... в этом случае я все еще хочу заполнить другие значения и поставить «NULL» в виде строки вместо o.number.

Есть хороший способсделать это, кроме проверки каждого значения?

Спасибо:)

Ответы [ 7 ]

3 голосов
/ 03 февраля 2011

Для проектов, где это актуально, я часто определяю метод Расширения ToStringOrNull следующим образом:

public static string ToStringOrNull(this object o) { 
    return o == null ? null : o.ToString();
}

Чтобы избежать интеллигентного загрязнения, если у вас есть ограниченный набор типов, для которых такой ToStringOrNull полезно, вы могли бы (и я иногда это делаю) избегать добавления расширения к object и вместо этого скопировать и вставить несколько копий для соответствующих типов.Функция легко написана как однострочная, поэтому использование кода для обхода этого дублирования является излишним.

Затем, если вы хотите заменить строку null на некоторый текст-заполнитель, используйте объединение нулейоператор.

например

string[] myArray = new [] {
    o.id, o.number.ToStringOrNull(), o.whatever, ...
};// .Select(s=>s??"NULL").ToArray(); //uncomment to replace null with "NULL"
3 голосов
/ 03 февраля 2011

Вам нужно проверить каждое значение, но оно не должно быть слишком плохим, используя ?? оператор, поэтому просто нужно сделать для каждого значения:

o.id ?? "NULL"
2 голосов
/ 03 февраля 2011

Это мое предложение.

Реализуйте метод расширения "AsString" следующим образом:

namespace ConsoleApplication1
{
    public static class ObjectExtensions
    {
        public static string AsString(this object source)
        {
            if (source != null)
            {
                return source.ToString();
            }
            else
            {
                return null;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            object a = null;
            object b = "not null";

            string someText = a.AsString();
        }
    }
}

Теперь вы можете вернуть строку, если у всей ссылки есть объект, или ноль, если у ссылки нет объекта.

1 голос
/ 03 февраля 2011

Вам нужно будет проверить каждое значение. Короткий способ сделать это будет что-то вроде:

string nullStr = "NULL";
foreach (MyObject o in MyObjectList) {
    string[] myArray = new string[] {
        o.id,
        (o.number ?? nullStr).ToString(),
        (o.whatever ?? nullStr).ToString(),
        ...
    };
}
1 голос
/ 03 февраля 2011

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

foreach(MyObject o in MyObjectList)
  string[] myArray = new string[] {
    o.id,
    (o.number == null ? "NULL" : o.number.toString(),
    o.whatever, ... };
0 голосов
/ 03 февраля 2011

Я бы выбрал один из этих двух вариантов:

1. Поскольку другие предложили реализовать метод расширения для типов, которые вы хотите проверить на null.

2.Если вы не можете / не хотите использовать методы расширения, вы можете определить вспомогательный метод в MyObject, который бы принимал объект и в основном делал ту же проверку нуля.

string Check(object o)
{
    return o == null ? null : o.ToString(); 
}

Затем вы должны обернуть каждое свойство, которое вы хотите, с помощью этого вызова метода.

foreach(MyObject o in MyObjectList)
    string[] myArray = new string[] {o.id, o.Check(o.number), o.whatever, ...}
0 голосов
/ 03 февраля 2011

Если вы хотите поместить в свой массив только ненулевые элементы, вам нужно будет проверить каждое значение. Обойти это невозможно.

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