Мне нужен фрагмент кода, который увеличивает конец строки в скобках «[]», но у меня от этого болит голова.
Дело в том, что если в данной коллекции существует имя «test», алгоритм должен вернутьtest_[0]
, если оба существуют, то "test_ [1]" и т. Д. Это работает до сих пор. Но когда я попытался передать в качестве значения currentName «test_ [что-то]», алгоритм создает что-то вроде test_[0]_[0]
, test_[0]_[1]
вместо test_[somenthing+someNumber]
. Кто-нибудь знает способ изменить это поведение?
// test test, test_[2], test_[3]
protected string GetDistinctName2(string currentName, IEnumerable<string> existingNames)
{
int iteration = 0;
if (existingNames.Any(n => n.Equals(currentName)))
{
do
{
if (!currentName.EndsWith($"({iteration})"))
{
currentName = $"{currentName}_[{++iteration}]";
}
}
while (existingNames.Any(n => n.Equals(currentName)));
}
return currentName;
}
РЕДАКТИРОВАТЬ: Лучшее решение до сих пор заключается в том (я могу поспорить, что я видел это здесь, но кто-то должен был удалить)
public static void Main()
{
var currentOriginal = "test";
var existingNamesOriginal = new[] { "test", "test_[2]", "test_[3]" };
string outputOriginal = GetDistinctNameFromSO(currentOriginal, existingNamesOriginal);
Console.WriteLine("original : " + outputOriginal);
Console.ReadLine();
}
protected static string GetDistinctNameFromSO(string currentName,
IEnumerable<string> existingNames)
{
if (null == currentName)
throw new ArgumentNullException(nameof(currentName));
else if (null == existingNames)
throw new ArgumentNullException(nameof(existingNames));
string pattern = $@"^{Regex.Escape(currentName)}(?:_\[(?<Number>[0-9]+)\])?$";
Regex regex = new Regex(pattern);
var next = existingNames
.Select(item => regex.Match(item))
.Where(match => match.Success)
.Select(match => string.IsNullOrEmpty(match.Groups["Number"].Value)
? 1
: int.Parse(match.Groups["Number"].Value))
.DefaultIfEmpty()
.Max() + 1;
if (next == 1)
return currentName; // No existingNames - return currentName
else
return $"{currentName}_[{next}]";
}
Для данной строки «test» она возвращает «test_ [4]», что превосходно, но если данная строка, скажем, «test_ [2]», она также должна возвращать «test_ [4]» (строка с заданнойшаблон с первым свободным номером), но вместо этого он возвращает «test_ [2] _ [2]».