Каковы альтернативы для разделения строки в C #, которые не используют String.Split () - PullRequest
2 голосов
/ 28 августа 2010

Я видел этот вопрос , который спрашивает, учитывая строку "Смит; Роджерс; МакКалн", как вы можете создать коллекцию. Ответом было использование String.Split.

Если у нас нет встроенного Split (), что вы делаете вместо этого?

Обновление:

Я признаю, что написать функцию разбиения довольно просто. Ниже то, что я бы написал. Переберите строку, используя IndexOf, и извлеките, используя Substring.

string s = "smith;rodgers;McCalne";

string seperator = ";";
int currentPosition = 0;
int lastPosition = 0;

List<string> values = new List<string>();

do
{
    currentPosition = s.IndexOf(seperator, currentPosition + 1);
    if (currentPosition == -1)
        currentPosition = s.Length;

    values.Add(s.Substring(lastPosition, currentPosition - lastPosition));

    lastPosition = currentPosition+1;

} while (currentPosition < s.Length);

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

Другие предложили следующее.

  1. Метод расширения, использующий блок итератора
  2. Предложение Regex (без реализации)
  3. Линк Агрегатный метод

Это оно?

Ответы [ 3 ]

9 голосов
/ 28 августа 2010

Довольно просто написать свой собственный Split эквивалент.

Вот краткий пример, хотя в действительности вы, вероятно, захотите создать некоторые перегрузки для большей гибкости.(Ну, на самом деле вы бы просто использовали встроенные в фреймворк Split методы!)

string foo = "smith;rodgers;McCalne";
foreach (string bar in foo.Split2(";"))
{
    Console.WriteLine(bar);
}

// ...

public static class StringExtensions
{
    public static IEnumerable<string> Split2(this string source, string delim)
    {
        // argument null checking etc omitted for brevity

        int oldIndex = 0, newIndex;
        while ((newIndex = source.IndexOf(delim, oldIndex)) != -1)
        {
            yield return source.Substring(oldIndex, newIndex - oldIndex);
            oldIndex = newIndex + delim.Length;
        }
        yield return source.Substring(oldIndex);
    }
}
2 голосов
/ 28 августа 2010

Вы делаете свой собственный цикл для разделения.Вот тот, который использует метод расширения Aggregate.Не очень эффективно, поскольку он использует оператор += в строках, поэтому его не следует использовать в качестве примера, но он работает:

string names = "smith;rodgers;McCalne";

List<string> split = names.Aggregate(new string[] { string.Empty }.ToList(), (s, c) => {
  if (c == ';') s.Add(string.Empty); else s[s.Count - 1] += c;
  return s;
});
1 голос
/ 28 августа 2010

Regex?

Или просто подстрока. Это то, что Сплит делает внутри

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