Проверьте, является ли словарное значение ключа нулевым - PullRequest
3 голосов
/ 26 февраля 2020

Я пытаюсь использовать словарь, и мне нужно проверить, является ли значение ключа (называемого именем) пустым, и если да, то использовать некоторую строку по умолчанию в качестве значения для моего ключа, как, например, «неизвестно».

Я знаю, что могу проверить строку, например, с помощью string.Length == 0, но моя проблема здесь в том, что у меня есть объект в качестве значения, и мне трудно его поймать.

Вот мой код:

 IDictionary<string, object> parameters = new Dictionary<string, object>();
 string Name = de.Properties["Name"].Value.ToString(); //Name is sometimes empty and sometimes not
 parameters.Add("Name", Name);

Обновление:

IDictionary<string, object> parameters = new Dictionary<string, object>();
string Name = de.Properties["Name"].Value.ToString();
 if (parameters.TryGetValue("Name", out var Name))
    {
      parameters.Add("Name", Name ?? "unknown");
    }

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

null и пустая строка - это совершенно разные вещи. null означает, что значения нет, а пустая строка является строкой, просто пустая. Вы не можете вызвать .ToString() или .Length в ноль, вы получите исключение именно потому, что нет значения для обработки этого вызова.

Вы можете использовать Dictionary.TryGetValue проверить наличие и получить значение одновременно.

После этого, если вы действительно хотите преобразовать все в строку, вы можете использовать условно-нулевой оператор ?. для вызова ToString() без выброса, если name равно нулю , Если name равно нулю, все выражение name?.ToString() также оценивается как null.

Затем вы можете использовать оператор слияния нуля ?? для замены нуля значением по умолчанию значение:

var de= new Dictionary<string, object?>();
de["Name1"]=null;
de["Name2"]=42;

if(de.TryGetValue("Name2",out var name))
{
    var valueAsString=name?.ToString() ;
    parameters.Add("Name2", valueAsString ?? "unknown");
}

Если вы просто хотите заменить пустые значения на значения по умолчанию, вам не нужно ToString():

if(de.TryGetValue("Name2",out var name))
{
    parameters.Add("Name2", name ?? "unknown");
}

Если вы хотите проверить на нулевое или пустое значение , вы можете использовать String.IsNullOrEmpty :

if(de.TryGetValue("Name2",out var name))
{
    var newValue=String.IsNullOrEmpty(name) 
                       ? "unknown" 
                       : name.ToString();  //Only if we want to format to strings
    parameters.Add("Name2", newValue);
}

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

parameters["Name2]= newValue;
2 голосов
/ 26 февраля 2020

Вы можете попробовать использовать метод ContainsKey, чтобы проверить, существует ли в словаре ключ Name. Затем получите фактическое строковое значение, проверив null, используя условный ноль ?. оператор . Если результат - null или пустая строка, вы установите для имени unknown значение

if (de.Properties.ContainsKey("Name"))
{
    var name = de.Properties["Name"]?.ToString();
    if (string.IsNullOrEmpty(name))
    {
        name = "unknown";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...