Разбить строку на подстроки на основе разделителя слева - PullRequest
0 голосов
/ 16 мая 2018

В c # есть элегантный способ разбить строку типа "a.b.c" на a, a.b, a.b.c
Количество разделителей не фиксировано, поэтому это может быть «a.b», который будет выводить {a, a.b} или «a.b.c.d», который будет выводить {a, a.b, a.b.c, a.b.c.d}.

Единственное, о чем я могу думать, это разбить строку на отдельные компоненты и затем снова объединить.

Это то, что я имею до сих пор:

var fieldNames = new List<string>();
var fieldSeparator ='.';
var myString = "a.b.c.d";
var individualFields = myString.Split(fieldSeparator);
string name = "";

foreach(var fieldName in individualFields)
{
    name = string.IsNullOrEmpty(name) ? fieldName : $"{name}{fieldSeparator}{fieldName}";
    fieldNames.Add(name);
}

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Это похоже на классический случай рекурсии.

List<string> splitCombine(string source, string delimiter, int startIndex)
{
    List<string> result = new List<string>();
    var indx = source.IndexOf(delimiter, startIndex);
    if (indx >= 0)
    {
        if (indx > 0)
        {
            result.Add(source.Substring(0, indx));
        }
        result.AddRange(splitCombine(source, delimiter, ++indx));
    }
    else
    {
        result.Add(source);
    }
    return result;
}

Вызов:

var result = splitCombine("a.b.c.d.e", ".", 0);
0 голосов
/ 16 мая 2018

Может быть это расширение?

public static string[] SplitCombineFirst(this string str, params string[] delimiter)
{
    string[] tokens = str.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
    var allCombinations = new List<string>(tokens.Length);
    for(int take = 1; take <= tokens.Length; take++)
    {
        string combination = string.Join(delimiter[0], tokens.Take(take));
        allCombinations.Add(combination);
    }
    return allCombinations.ToArray();
}

Звоните:

string[] result = "a.b.c".SplitCombineFirst(".");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...