Что не так с моим использованием String.EndsWith?

#c# #asp.net #ends-with

#c# #asp.net #заканчивается-с

Вопрос:

Я не могу понять, почему EndsWith возвращает false .

У меня есть код C #:

 string heading = "yakobusho";
bool test = (heading == "yakobusho");
bool back = heading.EndsWith("​sho");
bool front = heading.StartsWith("yak");
bool other = "yakobusho".EndsWith("sho");
Debug.WriteLine("heading = "   heading);
Debug.WriteLine("test = "   test.ToString());
Debug.WriteLine("back = "   back.ToString());
Debug.WriteLine("front = "   front.ToString());
Debug.WriteLine("other = "   other.ToString());
  

Результат таков:

 heading = yakobusho
test = True
back = False
front = True
other = True
  

Что происходит с EndsWith?

Комментарии:

1. Копирование этого в dotnetfiddle подчеркивает тот факт, что в начале "sho"

2. Разные символы, возможно, скрытый символ. Нет ничего плохого в EndsWith()

3. "​sho" Строка в третьей строке имеет длину 4 символа

Ответ №1:

Это содержит невидимый символ перед строкой «sho»:

 bool back = heading.EndsWith("​sho");
  

Исправленная строка:

 bool back = heading.EndsWith("sho");
  

Ответ №2:

"​sho" Строка в третьей строке начинается с пробела нулевой длины. "​sho".Length возвращает 4, а ((int)"​sho"[0]) возвращает 8203, значение Unicode для пробела нулевой длины.

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

 "x200Bsho"
  

Досадно, что этот символ не считается пробелом, поэтому его нельзя удалить с помощью String.Trim() .

Ответ №3:

В вашем EndsWith аргументе есть специальный символ.

Как вы можете видеть из этого кода:

   class Program
  {
    static void Main(string[] args)
    {
      string heading = "yakobusho";

      string yourText = "​sho";
      bool back = heading.EndsWith(yourText);

      Debug.WriteLine("back = "   back.ToString());
      Debug.WriteLine("yourText length = "   yourText.Length);

      string newText = "sho";
      bool backNew = heading.EndsWith(newText);

      Debug.WriteLine("backNew = "   backNew.ToString());
      Debug.WriteLine("newText length = "   newText.Length);

    }
  }
  

ВЫВОД:

 back = False
yourText length = 4
backNew = True
newText length = 3
  

Длина yourText равна 4, и поэтому в этой строке есть какой-то скрытый символ.

Надеюсь, это поможет.