Вопрос по c# – по имени String.Format, это возможно?

29

Вместо того, чтобы использовать{0} {1}и т. д. Я хочу использовать{title} вместо. Затем заполните эти данные как-то (ниже я использовалDictionary). Этот код недействителен и выдает исключение. Я хотел знать, могу ли я сделать что-то похожее на то, что я хочу. С помощью{0 .. N} не проблема. Мне было просто любопытно.

Dictionary<string, string> d = new Dictionary<string, string>();
d["a"] = "he";
d["ba"] = "llo";
d["lol"] = "world";
string a = string.Format("{a}{ba}{lol}", d);
Смотрите также:stackoverflow.com/questions/1322037/… Marc Gravell♦

Ваш Ответ

9   ответов
0

Функция интерполяции строк

Код, который решает ваш вопрос:

string a = $"{d["a"]}{d["ba"]}{d["lol"]}";
-1

http://www.c-sharpcorner.com/UploadFile/e4ff85/string-replacement-with-named-string-placeholders/

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

public static class StringExtension  
{  
    public static string Format( this string str, params Expression<Func<string,object>>[] args)  
    {  
        var parameters = args.ToDictionary( e=>string.Format("{{{0}}}",e.Parameters[0].Name), e=>e.Compile()(e.Parameters[0].Name));  

        var sb = new StringBuilder(str);  
        foreach(var kv in parameters)  
        {  
            sb.Replace( kv.Key, kv.Value != null ? kv.Value.ToString() : "");  
        }  

        return sb.ToString();  
    }  
}

Пример использования:

public string PopulateString(string emailBody)  
{  
  User person = _db.GetCurrentUser();  
  string firstName = person.FirstName;    //  Peter  
  string lastName = person.LastName;      //  Pan  
  return StringExtension.Format(emailBody.Format(  
    firstname => firstName,  
    lastname => lastName  
  ));   
} 
1
static public class StringFormat
{
    static private char[] separator = new char[] { ':' };
    static private Regex findParameters = new Regex(
        "\\{(?<param>.*?)\\}",
        RegexOptions.Compiled | RegexOptions.Singleline);

    static string FormatNamed(
        this string format,
        Dictionary<string, object> args)
    {
        return findParameters.Replace(
            format,
            delegate(Match match)
            {
                string[] param = match.Groups["param"].Value.Split(separator, 2);

                object value;
                if (!args.TryGetValue(param[0], out value))
                    value = match.Value;

                if ((param.Length == 2) && (param[1].Length != 0))
                    return string.Format(
                        CultureInfo.CurrentCulture,
                        "{0:" + param[1] + "}",
                        value);
                else
                    return value.ToString();
            });
    }
}

чем другой метод расширения, но он также должен позволять использовать не строковые значения и шаблоны форматирования, используемые в них, поэтому в вашем исходном примере:

Dictionary<string, object> d = new Dictionary<string, object>();
d["a"] = DateTime.Now;
string a = string.FormatNamed("{a:yyyyMMdd-HHmmss}", d);

Тоже будет работать ...

15

static string FormatFromDictionary(this string formatString, Dictionary<string, string> ValueDict) 
{
    int i = 0;
    StringBuilder newFormatString = new StringBuilder(formatString);
    Dictionary<string, int> keyToInt = new Dictionary<string,int>();
    foreach (var tuple in ValueDict)
    {
        newFormatString = newFormatString.Replace("{" + tuple.Key + "}", "{" + i.ToString() + "}");
        keyToInt.Add(tuple.Key, i);
        i++;                    
    }
    return String.Format(newFormatString.ToString(), ValueDict.OrderBy(x => keyToInt[x.Key]).Select(x => x.Value).ToArray());
}
Error: User Rate Limit ExceededformatStringError: User Rate Limit ExceededValueDictError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

public static string StringFormat(string format, IDictionary<string, string> values)
{
    foreach(var p in values)
        format = format.Replace("{" + p.Key + "}", p.Value);
    return format;
}
Error: User Rate Limit ExceededHi {{Name}}, is your name really {{Name}}?
Error: User Rate Limit Exceeded
-2

(ваш словарь + foreach + string.

Очевидно неоптимизированный, но ...

7
It's possible now

Интерполированные строки C # 6.0 вы можете сделать это:

string name = "John";
string message = $"Hi {name}!";
//"Hi John!"
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
7

    public static string StringFormat(string format, IDictionary<string, object> values)
    {
        var matches = Regex.Matches(format, @"\{(.+?)\}");
        List<string> words = (from Match matche in matches select matche.Groups[1].Value).ToList();

        return words.Aggregate(
            format,
            (current, key) =>
                {
                    int colonIndex = key.IndexOf(':');
                    return current.Replace(
                        "{" + key + "}",
                        colonIndex > 0
                            ? string.Format("{0:" + key.Substring(colonIndex + 1) + "}", values[key.Substring(0, colonIndex)])
                            : values[key].ToString());
                });
    }

Как пользоваться:

string format = "{foo} is a {bar} is a {baz} is a {qux:#.#} is a really big {fizzle}";
var dictionary = new Dictionary<string, object>
    {
        { "foo", 123 },
        { "bar", true },
        { "baz", "this is a test" },
        { "qux", 123.45 },
        { "fizzle", DateTime.Now }
    };
StringFormat(format, dictionary)
Error: User Rate Limit ExceededStringFormat("{{key}}", new Dictionary<string, object>(){["key"] = "value"});Error: User Rate Limit Exceeded
3

в своем блоге:http://haacked.com/archive/2009/01/14/named-formats-redux.aspx, Я использовал «Hanselformat» Версия на два проекта без нареканий.

Error: User Rate Limit Exceeded

Похожие вопросы