2016-03-30 3 views
-5

В моем приложении я получаю описание, зарегистрированное из Active Directory, а затем назначая его строке, поэтому я могу позже проверить эту строку для «Контракт», чтобы игнорировать этих пользователей.
Проблема не у всех пользователей есть значение в поле описания, которое приводит к выбросу Null Reference Exception. Единственный способ, с помощью которого я могу думать об этом, - добавить еще одну проверку с помощью String.IsNullOrEmpty и добавить значение temp, а затем удалить это временное значение. Это кажется громоздким и неправильным.Использование String.Contains в строке значения Null

Что мне нужно сделать, чтобы иметь дело с null в строке во время моей проверки? Я попытался следующие два набора кода, как бросить ошибку:

var userDescription = (string)userDirectoryData.Properties["description"].Value; 

if (userDescription.Contains("Contracted")) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 

И

var userDescription = (string)userDirectoryData.Properties["description"].Value; 

if (userDescription.IndexOf("Contracted") > -1) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 

EDIT: По https://msdn.microsoft.com/en-us/library/k8b1470s.aspx я не могу установить в String.Empty, как будет возвращать результат «0», вызывающий ложное положительное, описание содержит только «Контракт».

+0

Не уверен, что вы подразумеваете под «добавлением временного значения», но использование 'String.IsNullOrEmpty' (или' String.IsNullOrWhitespace') было бы совершенно нормальным здесь. –

+2

И в чем разница между этими двумя данными фрагментами? –

+1

'if (userDescription! = Null && userDescription.IndexOf (« Contracted »)> -1)' – Magnus

ответ

2

Назначают пустую строку, если значение равно нулю, используя C# обнуляемым COALESCE:

var userDescription = (string)userDirectoryData.Properties["description"].Value ?? String.Empty; 

if (userDescription.Contains("Contracted")) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 
+0

IndexOf вернет 0 на строку.Пустое значение, хотя это означает, что проверка будет флаг ложных срабатываний https://msdn.microsoft.com/en-us/library/k8b1470s.aspx – Matthew

+0

Хорошая точка. Изменено для Contains() –

+0

Да, хотя ваш пост остался у меня, я мог бы сделать это с помощью «TheContains», но грубо, когда я забыл, что я получаю штурм ненависти, но когда ответ никто не ненавидит. Действительно отталкивает людей от SO. – Matthew

0

Перед C# 6, используя string.IsNullOrEmpty (или ответ Джеймса Дэв) необходимо

var userDescription = (string)userDirectoryData.Properties["description"].Value; 
if (!string.IsNullOrEmpty(userDescription) && userDescription.IndexOf("Contracted") > -1) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 

С C# 6 вы можете уменьшить это до нулевого оператора распространения (?.):

if ((string)userDirectoryData.Properties["description"].Value?.IndexOf("Contracted") > -1) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 
1

Немного combersome C# 6.0 синтаксис ?. (вместо . в userDescription.Contains) можно использовать

if (userDescription?.Contains("Contracted") == true) { 
    continue; 
    } 
    else { 
    // Do Stuff here 
    } 

сожалению (в данном случае) Boolean? не может быть брошено неявно к Boolean и вот почему == true. В случае IndexOf код выглядит вполне нормально:

if (userDescription?.IndexOf("Contracted") > -1) { 
    continue; 
    } 
    else { 
    // Do Stuff here 
    } 
0

Вы можете переопределить Contains() и IndexOf и определить пользовательский вывод в случае строка равна нулю, как это:

public static class Extensions 
{ 
    public static bool Contains(this string value, string search) 
    { 
     if(value != null) 
     { 
      return value.Contains(search); 

     } 
     else 
     { 
      // IF ITS NULL DEFINE YOUR RETURN HERE 
     } 
     return false; 
    } 

    public static int IndexOf(this string value, string search) 
    { 
     if(value != null) 
     { 
      return value.IndexOf(search); 
     } 
     else 
     { 
      // IF ITS NULL DEFINE YOUR RETURN HERE 
     } 
     return -1; 
    } 
} 

Использование остается неизменным, за исключением от поведения с нулевыми значениями. Проверьте мои комментарии.

+0

Бит overkill вы не думаете? – Matthew

Смежные вопросы