Есть ли способ отформатировать строку по имени, а не по позиции в C #?
В python я могу сделать что-то вроде этого примера (бесстыдно украденного отсюда ):
>>> print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}
Python has 002 quote types.
Есть ли способ сделать это в C #? Скажем, например:
String.Format("{some_variable}: {some_other_variable}", ...);
Было бы неплохо сделать это, используя имя переменной, но допустим и словарь.
c#
.net-3.5
string-formatting
Джейсон Бейкер
источник
источник
Ответы:
Для этого нет встроенного метода.
Вот один из методов
Вот еще один
Третий улучшенный метод, частично основанный на двух выше , от Фила Хаака
источник
У меня есть реализация, которую я только что разместил в своем блоге здесь: http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx
Это решает некоторые проблемы, которые эти другие реализации имеют с выходом скобки. У поста есть подробности. Это тоже делает DataBinder.Eval, но все еще очень быстро.
источник
Интерполированные строки были добавлены в C # 6.0 и Visual Basic 14
Оба были представлены через новый компилятор Roslyn в Visual Studio 2015 .
C # 6.0:
return "\{someVariable} and also \{someOtherVariable}"
ИЛИreturn $"{someVariable} and also {someOtherVariable}"
Источник: что нового в C # 6.0
VB 14:
return $"{someVariable} and also {someOtherVariable}"
Интересные функции (в Visual Studio 2015 IDE):
{index}
работает, но и{(index + 1).ToString().Trim()}
Наслаждайтесь! (и нажмите «Отправить улыбку» в VS)
источник
Вы также можете использовать анонимные типы, как это:
Конечно, для разбора форматирования потребуется больше кода, но вы можете отформатировать строку с помощью этой функции, например:
источник
Кажется, нет способа сделать это из коробки. Тем не менее, выглядит возможным реализовать свою собственную
IFormatProvider
ссылкуIDictionary
на значения.Выходы:
Предостережение заключается в том, что вы не можете смешивать
FormatProviders
текст, поэтому нельзя использовать причудливое форматирование текста одновременно.источник
Сам фреймворк не предоставляет способа сделать это, но вы можете взглянуть на этот пост Скотта Хансельмана. Пример использования:
Этот код Джеймса Ньютона-Кинга похож и работает с подсвойствами и индексами,
Код Джеймса опирается на System.Web.UI.DataBinder для анализа строки и требует ссылки на System.Web, что некоторым людям не нравится делать в не-веб-приложениях.
РЕДАКТИРОВАТЬ: Да, и они прекрасно работают с анонимными типами, если у вас нет объекта со свойствами, готовыми к нему:
источник
Видеть Https://stackoverflow.com/questions/271398?page=2#358259
С помощью связанного расширения вы можете написать это:
и ты получишь
"foo 2 System.Object
".источник
Я думаю, что ближе всего вы получите индексированный формат:
Есть также String.Replace (), если вы хотите сделать это в несколько шагов и поверить, что вы не найдете свои «переменные» где-либо еще в строке:
Расширяя это, чтобы использовать список:
Вы также можете сделать это с помощью Dictionary <string, string>, перебирая его коллекции .Keys, но используя List <KeyValuePair <string, string >>, мы можем воспользоваться преимуществом метода List .ForEach () и сжать его обратно до однострочник:
Лямбда была бы еще проще, но я все еще на .Net 2.0. Также обратите внимание, что производительность .Replace () не является звездной при многократном использовании, поскольку строки в .Net являются неизменяемыми. Кроме того, для этого требуется, чтобы
MyString
переменная была определена таким образом, чтобы она была доступна делегату, поэтому она еще не идеальна.источник
Моя библиотека с открытым исходным кодом, Regextra , поддерживает именованное форматирование (среди прочего). В настоящее время он нацелен на .NET 4.0+ и доступен на NuGet . У меня также есть вступительное сообщение в блоге об этом: Regextra: помогает вам уменьшить ваши (проблемы) {2} .
Именованный бит форматирования поддерживает:
Пример:
Результат:
Проверьте ссылку проекта GitHub (выше) и вики для других примеров.
источник
Проверьте это:
Образец:
Производительность довольно хорошая по сравнению с другими решениями.
источник
Я сомневаюсь, что это будет возможно. Первое, что приходит на ум, это как получить доступ к именам локальных переменных?
Однако для этого можно использовать какой-нибудь умный способ использования выражений LINQ и Lambda.
источник
Вот один, который я сделал некоторое время назад. Он расширяет String с помощью метода Format, принимающего один аргумент. Приятно то, что он будет использовать стандартную строку. Формат, если вы предоставите простой аргумент, такой как int, но если вы используете что-то вроде анонимного типа, это тоже будет работать.
Пример использования:
Результатом будет «Семья Смитов имеет 4 детей».
Это не делает сумасшедшие привязки, такие как массивы и индексаторы. Но это супер просто и высокая производительность.
источник
Пример:
Вывод: 你好, wayjet, 今天 是 2011-05-04, 这 是 你 第 18 次 登录 , 积分 {100.40}
источник
Вот простой метод для любого объекта:
А вот как это использовать:
выходной: 27.02.2012
источник
Я реализовал это простой класс, который дублирует функциональность String.Format (за исключением случаев использования классов). Вы можете использовать словарь или тип для определения полей.
https://github.com/SergueiFedorov/NamedFormatString
C # 6.0 добавляет эту функциональность прямо в спецификацию языка, поэтому
NamedFormatString
для обратной совместимости.источник
Я решил это немного иначе, чем существующие решения. Это делает ядро замены названного элемента (а не бит отражения, который сделали некоторые). Это очень быстро и просто ... Это мое решение:
Он используется следующим образом:
Надеюсь, кто-то найдет это полезным!
источник
Несмотря на то, что принятый ответ дает несколько хороших примеров, .Inject, а также некоторые примеры Haack не обрабатывают экранирование. Многие также сильно зависят от Regex (более медленный) или DataBinder.Eval, который недоступен в .NET Core и в некоторых других средах.
Имея это в виду, я написал простой парсер на основе конечного автомата, который выполняет потоковую обработку символов, запись в
StringBuilder
вывод, символ за символом. Он реализован какString
метод (ы) расширения и может принимать в качестве входных данных как a, такDictionary<string, object>
иobject
параметры (используя отражение).Он обрабатывает неограниченные уровни
{{{escaping}}}
и броски,FormatException
когда ввод содержит несбалансированные фигурные скобки и / или другие ошибки.В конечном счете, вся логика сводится к 10 основным состояниям - поскольку, когда конечный автомат находится за скобкой и аналогично внутри скобки, следующим символом является либо открытая скобка, экранированная открытая скобка, закрытая скобка, экранированная закрытая скобка, или обычный персонаж. Каждое из этих условий обрабатывается индивидуально по мере прохождения цикла, добавляя символы либо к выходу,
StringBuffer
либо к клавишеStringBuffer
. Когда параметр закрыт, значение ключаStringBuffer
используется для поиска значения параметра в словаре, который затем помещается в выводStringBuffer
. В концеStringBuffer
возвращается значение вывода .источник
Изменить: то, что я должен был сказать, было: «Нет, я не верю, что то, что вы хотите сделать, поддерживается C #. Это настолько близко, насколько вы собираетесь получить».
источник
"someString" + someVariable + "someOtherString"
более читабельной. Эта статья с вами согласна.