Строковое равенство с нулевой обработкой

Я часто буду использовать этот код для сравнения строки:

if(!string.IsNullOrEmpty(str1) && str1.Equals(str2)){
    //they are equal, do my thing
}

Сначала обрабатывается нулевой регистр и т.д.

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

(У меня дежавю, что я, возможно, спрашивал об этом раньше, прошу прощения, если это так)


Обновление: в моем случае str2 является заведомо хорошей строкой для сравнения, поэтому мне не нужно проверять ее на нуль. str1 — это «неизвестная» строка, которая может быть нулевой, поэтому я хочу сказать, что «str1 не равна str2» в тех случаях, когда str1 является нулевым...


person Brady Moritz    schedule 03.03.2013    source источник
comment
Ваш код неверен; он вернет true, если str1 равно null, а str2 нет.   -  person SLaks    schedule 03.03.2013
comment
@SLaks На самом деле, я думаю, это то, чего он хочет. По крайней мере, судя по описанию   -  person Justin Pihony    schedule 03.03.2013
comment
У меня есть ! там, поэтому он будет продолжаться только в том случае, если строка для сравнения НЕ является нулевой/пустой. верно?   -  person Brady Moritz    schedule 05.03.2013
comment
по-видимому, в С# 6 теперь есть функции для обработки этого   -  person Brady Moritz    schedule 16.11.2015


Ответы (8)


В отличие от Java, строки C# переопределяют оператор ==:

if (str1 == str2)

Если вы хотите сравнение без учета регистра:

if (String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)
person SLaks    schedule 03.03.2013
comment
Я оставлю это на усмотрение OP, но я считаю, что цель состоит в том, чтобы также потерпеть неудачу, если какая-либо из сторон null - person Justin Pihony; 03.03.2013
comment
@JustinPihony str1 == str2 && str1 != null по-прежнему намного элегантнее. - person p.s.w.g; 03.03.2013
comment
@ p.s.w.g И это нормально, но в этом ответе об этом не говорится. Кроме того, см. мой ответ, чтобы узнать, как это инкапсулировать... как указано, наименование метода может быть самым сложным. - person Justin Pihony; 03.03.2013

Если вы не хотите рассматривать две строки null как равные друг другу, ваш код оптимален.

Если, с другой стороны, вы хотите рассматривать значения null как равные друг другу, вы можете использовать

object.Equals(str1, str2)

для более "симметричного" подхода, который также обрабатывает значения null.

person Sergey Kalinichenko    schedule 03.03.2013
comment
хорошо, это действительно сработает для меня, поскольку str2 - это известное значение, а не нулевое. Таким образом, нулевое сравнение не имеет значения. - person Brady Moritz; 05.03.2013
comment
Это полезная функция, которую нужно знать. Однако в моем конкретном случае это не помогает, так как пустое значение в первом объекте равно null, а пустое значение во втором значении — это пустая строка. Но спасибо! - person CigarDoug; 11.02.2015
comment
@CigarDoug В строках C# нет такого понятия, как пустое значение, равное null. К сожалению, они часто выглядят одинаково, что вызывает много путаницы. Вы можете исправить это, используя выражение object.Equals(str1 ?? "", str2 ?? ""). - person Sergey Kalinichenko; 11.02.2015
comment
@dasblinkenlight В моем конкретном случае я сравниваю текущее значение элемента управления SharePoint (нулевое, если оно пустое) с текущим значением поля в списке SharePoint (пустая строка, если оно пустое, в зависимости от метода, который я использую для получения значения) . Итак, в этом случае мне нужно проверить значение null, а затем проверить равенство. Но я посмотрю на ваш пример, чтобы увидеть, выполняет ли он то же самое. Спасибо! - person CigarDoug; 12.02.2015

Я знаю, что этому уже несколько лет, и я думаю, что решение от dasblinkenlight функционально идеально подходит для того, о чем вы просили. Однако я предпочитаю этот код из соображений удобочитаемости:

String.Equals(str1, str2)
person dotsven    schedule 26.06.2015

Для этого нет встроенного способа, но вы можете создать метод расширения для инкапсуляции этого.

public static StringExtensions
{
    public static Boolean IsNotNullAndEquals(this string str1, string str2)
    {
        return !string.IsNullOrEmpty(str1) && str1.Equals(str2)
    }
}

затем используйте его следующим образом:

str1.IsNotNullAndEquals(str2);

Именование будет вашей самой сложной задачей здесь, ИМО... так как вам нужно сообщить, что вы проверяете только нулевое значение str1. При использовании в качестве метода расширения он читается довольно хорошо, но при использовании в качестве обычного статического метода он также не передает этого.

person Justin Pihony    schedule 03.03.2013
comment
Это то, что я считал нужным. Было действительно более любопытно, есть ли что-то встроенное, что справилось бы с этим, но похоже, что нет. Спасибо! - person Brady Moritz; 05.03.2013
comment
на самом деле, будет ли метод расширения работать для str1, если str1 имеет значение null? Я думаю, что это будет бомба с нулевым исключением - person Brady Moritz; 05.03.2013
comment
@boomhauer Во-первых, я так думаю, но скоро проверю. Во-вторых, если это работает, приветствуются голосование и принятие. - person Justin Pihony; 05.03.2013
comment
@boomhauer Я не проверял это, но у меня было больше времени, чтобы запомнить это. Это будет работать, даже если str1 равно нулю. Причина в том, что это просто синтаксический сахар для вызова StringExtensions.IsNotNullAndEquals(str1, str2). Он только ВЫГЛЯДИТ так, как будто это вызов метода для str1. - person Justin Pihony; 05.03.2013

Вы можете использовать этот код

object.Equals(str1, str2)
person Community    schedule 03.03.2013

Это сделает это:

string.IsNullOrWhiteSpace(str1) ? string.IsNullOrWhiteSpace(str2) : str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
person Emad Jazer    schedule 16.05.2018

Я знаю, что это был ответ некоторое время назад, и есть хорошие ответы, хотя согласно документации Microsoft (https://docs.microsoft.com/en-us/dotnet/api/system.string.equals?view=net-5.0), вы можете использовать следующие чтобы проверить оба случая:

if(string.Equals(str1,str2)){
    //they are equal with null handling
}
person Juan Medina    schedule 10.06.2021
comment
хороший ответ, но на самом деле он уже был предложен - person Brady Moritz; 22.06.2021

В более поздних версиях C# у нас также есть опция объединения null. Это не точное решение, но может быть более чистым для некоторых целей. Требуются некоторые вольности при обновлении str1 до пустой строки для целей сравнения в случаях, когда она на самом деле является нулевой.

if((str1??"").Equals(str2))
{
    //they are equal, do things here
}
person Brady Moritz    schedule 13.01.2020
comment
почти - я подозреваю, что опечатка .. нужно '??' (объединение) против '?'. Таким образом, ответ может быть следующим: if ( (str1??).Equals(str2)). {они равны}. - person MarkD; 28.05.2020
comment
да ты был прав. Я смешал его с другим новым оператором для вызова методов потенциально нулевых объектов. - person Brady Moritz; 22.06.2021