Я обволакиваю голову вокруг этого, чтобы найти «изящное» решение, но я не совсем этому доволен.Заменить строки вхождения со списком записей
Возможные входные строки:
foo() bar()
() bar
foo
()()foo() bar
Там может быть "неограниченные" кронштейны и дополнительные, не скобка текст inbe между скобками. Содержимое этих пустых скобок должно заполняться данными, взятыми из List<string>
в порядке ввода записей в список. Если нет записей или недостаточно записей, скобки не затронуты.
Возможные строковые замены:
foo() bar()
заменен x, y
приведет foo (x) bar (y)
foo() bar()
заменен x
приведет foo (x) bar()
foo() bar()
заменен x, y, z
приведет к foo (x) bar (y)
Надеюсь, вы поняли эту идею.
Решения: Решения, которые я до сих пор проделывал с индексами и особой логикой для обработки различных случаев.
Я задавался вопросом, есть ли более элегантное решение с, например, регулярным выражением. Может быть, я сейчас слишком близко к задаче и есть простое решение :-)
Вот подход я не очень доволен (читаемость/легко понять):
var guiIdentifierIndex = 0;
var guiIdentifierList = new List<string>{"x", "y", "z", "x", "y"};
var sourcePathItem = "foo()";
string targetString = "";
var splittedPath = sourcePathItem.Split(new string[] { BRACKETS }, StringSplitOptions.None);
for (int index = 0; index < splittedPath.Length; index++)
{
var subPath = splittedPath[index];
var guiIdentifier = string.Empty;
if (guiIdentifierIndex < guiIdentifierList.Count)
{
guiIdentifier = guiIdentifierList[guiIdentifierIndex];
guiIdentifierIndex++;
}
targetString += subPath;
if (index < splittedPath.Length - 1)
targetString += string.Format("({0})", guiIdentifier);
}
http://volatileread.com/utilitylibrary/snippetcompiler?id=22718
Это не будет работать, если не будет достаточно идентификатор в списке (вне диапазона) – derape
@derape: вы правы - я редактировал код - я не обращал внимания на * Если нет записей или не хватает записей, скобки нетронуты * - обычно, если есть два элемента, лучший выбор это исключение. –
Yay =) Могут ли быть какие-либо проблемы с 'guiIdentifierIndex' в закрытии? – derape