Найдите все вхождения подстрок с [токенами] в строке и поместите их в массив int - PullRequest
1 голос
/ 04 апреля 2020

У меня есть рабочий код для замены одной подстроки в [] в строке. Это сработало для «[1]» в строке:

private string returnWithLinks(string adminString, int adminId)
    {
        var returnString = "Nothing at all";

        int pFrom = adminString.IndexOf("[") + "[".Length;
        int pTo = adminString.LastIndexOf("]");

        var getSourceId = adminString.Substring(pFrom, pTo - pFrom);

        int i = 0;
        bool tryParse = int.TryParse(getSourceId, out i);
        if(!tryParse) {returnString = "this is not an int!";} else {
            if(i == 1) {
                returnString = adminString.Replace("[1]", "<a>something</a>" + var1fromsomwhere + i);
            } else if (i == 2) {
                returnString = adminString.Replace("[2]", "<a>other something</a>" + var2fromsomwhere + i);
            } else if (i == 3) {
                returnString = adminString.Replace("[3]", "<a>other something</a>" + var3fromsomwhere + i);
            } else if (i == 4) {
                returnString = adminString.Replace("[4]", "<a>other something</a>" + var4fromsomwhere + i);
            } else if (i == 5) {
                returnString = adminString.Replace("[5]", "<a>other something</a>" + var5fromsomwhere + i);
            }
        }
        return returnString;
    }

Однако теперь мне нужно иметь возможность заменить все вхождения токенов, такие как:

adminString = "[1][2]somthingelse[2]another[4]aa";

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

Как мне этого добиться?

После получения массива я пройду через него oop с предложениями if.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Вам не нужен массив или даже все oop.

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

Но в вашем случае есть не нужно усложнять вещи.

Одна строка кода заменит все так:

    private string returnWithLinks(string adminString, int adminId)
    {
            var returnString = adminString
               .Replace("[1]", "<a>something</a>" + var1fromsomwhere + 1)
               .Replace("[2]", "<a>something</a>" + var2fromsomwhere + 2)
               .Replace("[3]", "<a>something</a>" + var3fromsomwhere + 3)
               .Replace("[4]", "<a>something</a>" + var4fromsomwhere + 4)
               .Replace("[5]", "<a>something</a>" + var5fromsomwhere + 5);

            return returnString;
    }

Выполнение со словарем и др. oop:

    private static readonly Dictionary<string, string> _replacements = new 
    Dictionary<string, string>
    {
        { "[1]", "<a>something</a>" + var1fromsomwhere + 1 },
        { "[2]", "<a>something</a>" + var2fromsomwhere + 2 },
        { "[3]", "<a>something</a>" + var3fromsomwhere + 3 },
        { "[4]", "<a>something</a>" + var4fromsomwhere + 4 },
        { "[5]", "<a>something</a>" + var5fromsomwhere + 5 },            
    };
    private string returnWithLinks(string adminString, int adminId)
    {
            var keys = _replacements.Keys.ToArray();
            var returnString = adminString;

            for(var i = 0; i < keys.Length; i++)
            {
                var key = keys[0];

                returnString = returnString.Replace(key, _replacements[key]);
            }

            return returnString;
    }

Как видите, словарь выглядит чище, но с точки зрения обслуживания и количества строк кода это одно и то же.

Вам все равно нужно будет добавить строку в словарь для каждой замены.

Единственная причина, по которой я бы сделал это в al oop со словарем, заключается в том, что словарь НЕ жестко закодирован ,

Значение, если словарь был заполнен, например, значениями из базы данных.

Другим недостатком l oop является количество выделенных строк на одно дополнительное выделение на одну итерацию.

0 голосов
/ 04 апреля 2020

Вы можете просто запустить замену в al oop.

var tokens = new[] { "[1]", "[2]", "[3]", "[4]" };
var replacements = new[] { "one", "two", "three", "four" };

var adminString = "[1][2]somthingelse[2]another[4]aa";
for (int i = 0; i < tokens.Length; i++)
{
   adminString = adminString.Replace(tokens[i], replacements[i]);
}
Console.WriteLine(adminString); //onetwosomthingelsetwoanotherfouraa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...