String.Empty в строках - PullRequest
       3

String.Empty в строках

6 голосов
/ 12 января 2011

2 дня назад возник вопрос, связанный с string.LastIndexOf(String.Empty) возвратом последнего индекса строки:

В конце строки C # заканчиваются пустой строкой?

ИтакЯ думал так;строка всегда может содержать string.empty между символами, например:

"testing" == "t" + String.Empty + "e" + String.Empty +"sting" + String.Empty;

После этого я хотел проверить, возвращает ли String.IndexOf(String.Empty) 0, потому что String.Empty может находиться между любым символом в строке, чтобыло бы то, что я ожидаю, что он вернется, и я не ошибся.

string testString = "testing";
int index = testString.LastIndexOf(string.Empty); // index is 6
index = testString.IndexOf(string.Empty); // index is 0

На самом деле вернул 0. Я начал думать, что если бы я мог разбить строку с String.Empty, я бы получил по крайней мере2 строки, и это будет String.Empty, а остальная часть строки, поскольку String.IndexOf(String.Empty) вернула 0, а String.LastIndexOf(String.Empty) вернула длину строки. Вот что я кодировал:

string emptyString = string.Empty;
char[] emptyStringCharArr = emptyString.ToCharArray();
string myDummyString = "abcdefg";
string[] result = myDummyString.Split(emptyStringCharArr);

Проблема здесьЯ не могу явно преобразовать String.Empty в char[] и привести к пустой строке [].Мне бы очень хотелось увидеть результат этой операции и причину этого.Поэтому мои вопросы:

  1. Есть ли способ разбить строку с помощью String.Empty?

  2. Если это невозможно, но вабсолютный мир, который был бы возможен, будет ли он возвращать массив, полный символов типа [0] = "t" [1] = "e" [2] = "s" и так далее, или он просто вернет полную строку?Что будет иметь больше смысла и почему?

Ответы [ 6 ]

2 голосов
/ 12 января 2011

Да, вы можете разбить любую строку на строку .Empty

 string[] strArr = s.Split(string.Empty.ToCharArray());
2 голосов
/ 12 января 2011

Вы всегда получите индекс 0, когда будете искать String.Empty в любой строке, потому что это определение String.IndexOf(String.Empty), вам следует взглянуть на MSDN , где написано:

"Позиция индекса на основе нуля значения, если эта строка найдена, или -1, если это не так. Если значение равно String.Empty, возвращаемое значение равно 0."

Направлено на ваш второй вопрос:

Я думаю, что вы можете разделить строку пустой строкой, сделав что-то вроде этого в вашем коде:

String test = "fwewfeoj";
test.Split(new String[] { String.Empty }, StringSplitOptions.None);

Кстати: возможноКлон этого ответа Почему "abcd" .StartsWith ("") возвращает true?

1 голос
/ 12 января 2011
string emptyString = string.Empty;
char[] emptyStringCharArr = emptyString.ToCharArray();

Это даст вам пустой массив символов. Это потому, что String уже является массивом символов в памяти, а String.Empty не имеет значения.

Чтобы разбить его дальше, рассмотрим реализацию .ToCharArray ()

private Char[] toCharArray(String value)
{
    var stringLength = value.Length;
    var returningArray = new char[stringLength];
    for(var i = 0; i < stringLength; i++)
    {
        returningArray[i] = value[i];
    }
    return returningArray;
}

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

Это не массив с единственным элементом String.Empty, потому что это не имеет смысла. Когда вы пытаетесь разделить пустой массив, он не знает, как и на что разделить, поэтому вы возвращаете исходную строку.

Что касается того, почему он возвращает 0 по умолчанию, рассмотрим:

private int IndexOf(String value, String searchFor)
{
    for(var i = 0; i < value.Length; i++)
    {
        if(value.Substring(i, searchFor.Length) == searchFor)
        {
            return i;
        }
    }
    return -1;
}
private int LastIndexOf(String value, String searchFor)
{
    var searchLength = searchFor.Length;
    for(var i = value.Length - searchFor.Length; i >= 0; i--)
    {
        if(value.Substring(i, searchLength) == searchFor)
            return i;
    }
    return -1;
}

String.SubString (x, 0) ВСЕГДА возвращает String.Empty, независимо от того, что было передано (даже String.Empty). По этой причине гораздо быстрее добавить проверку и вернуть 0 независимо (как это было бы, даже если бы он выполнял цикл).

1 голос
/ 12 января 2011

Вам действительно нужно , чтобы разбить строку, или вы просто пытаетесь получить все отдельные символы?

Если это так, то строка также является IEnumerable<char>, иу вас также есть индексатор.

Итак, что вы на самом деле пытаетесь сделать?

И нет, вы не можете вызывать методы split с помощью string.Empty или аналогичных конструкций.

0 голосов
/ 12 января 2011

Вы также можете сказать

"testing" == string.Empty + string.Empty + string.Empty + ... + "t" +  string.Empty + string.empty + "esting";

Так что на самом деле вы можете поместить бесконечный массив string.empty между каждым символом.

Так что я думаю 1 не возможно 2 нет, просто нет смысла ...

0 голосов
/ 12 января 2011

Так как String.Empty - просто пустая строка, поэтому, если вы сделаете:

var s = "part1" + string.Empty + "part2";

, это приведет к точно такой же строке, как:

var s = "part1" + "part2";

, первый синтаксис будетне вставляйте волшебную пустую строку между двумя частями.

То, что IndexOf возвращает 0, по определению не потому, что между символами есть какая-то волшебная пустая строка.

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

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