String.Format параметр порядка раздражения - PullRequest
7 голосов
/ 15 сентября 2009

действительно раздражает то, что C #, кажется, заставляет вас явно указывать индекс каждого параметра в String.Format. Если вы хотите добавить другой параметр где-то, вам нужно либо переиндексировать строку, либо поместить новый параметр в конец ,

Есть ли способ заставить C # сделать это автоматически?

например. (Я знаю, что это бессмысленные педанты, это просто пример:)

Я начинаю с:

String.Format("{0} {1} {1} {2} {3}", a, b, c, d)

Если я хочу добавить параметр в начале, я могу сделать одно из следующих действий:

String.Format("{4} {0} {1} {1} {2} {3}", a, b, c, d, e)
String.Format("{0} {1} {2} {2} {3} {4}", e, a, b, c, d)

в Delphi, например, я мог бы сделать эквивалент этого:

String.Format("{} {} {} {2} {} {}", e, a, b, c, d)

Ответы [ 5 ]

24 голосов
/ 15 сентября 2009

Ну, нет ничего в C #, чтобы сделать это автоматически для вас. Вы всегда можете написать свой собственный метод для этого, но, честно говоря, я бы нашел его менее читабельным. Намного больше нужно подумать (ИМО), чтобы понять, что делает ваша последняя строка, чем предыдущая. Когда вы нажимаете {2}, вы должны мысленно вернуться назад и заменить предыдущий элемент на {3}, чтобы пропустить {2} и т. Д.

Лично я предпочитаю код, который печатается немного дольше, но его легко читать.

4 голосов
/ 30 ноября 2016

Начиная с Visual Studio 2015, вы можете обойти эту проблему, используя Интерполированные строки (это трюк с компилятором, поэтому не имеет значения, на какую версию платформы .net вы нацелены).

Код выглядит примерно так

string txt = $"{person.ForeName} is not at home {person.Something}"; 

Я думаю, это делает код более читабельным и менее подверженным ошибкам.

2 голосов
/ 15 сентября 2009

Запрашиваемая вами функция не является частью фреймворка. Вот хороший метод расширения, который я нашел, который предоставляет именованные параметры c #. Я думаю, что Марк Гравелл опубликовал это или один из тех других ГУ.

        static readonly Regex rePattern = new Regex(@"\{([^\}]+)\}", RegexOptions.Compiled);


    /// <summary>
    /// Shortcut for string.Format. Format string uses named parameters like {name}.
    /// 
    /// Example: 
    /// string s = Format("{age} years old, last name is {name} ", new {age = 18, name = "Foo"});
    ///
    /// </summary>
    /// <param name="format"></param>
    /// <param name="values"></param>
    /// <returns></returns>
    public static string FN<T>(this string pattern, T template)
    {
        Dictionary<string, string> cache = new Dictionary<string, string>();
        return rePattern.Replace(pattern, match =>
        {
            string key = match.Groups[1].Value;
            string value;

            if (!cache.TryGetValue(key, out value))
            {
                var prop = typeof(T).GetProperty(key);
                if (prop == null)
                {
                    throw new ArgumentException("Not found: " + key, "pattern");
                }
                value = Convert.ToString(prop.GetValue(template, null));
                cache.Add(key, value);
            }
            return value;
        });
    }
1 голос
/ 27 мая 2011

Я знаю, что это старо, я согласен с Джоном. Даже со строкой большого формата (см. Пример кода ниже) мне все еще требуется менее 1 минуты, чтобы переделать позиции индекса элементов, если мне нужно что-то добавить, и я нахожу это более понятным и читаемым, чем попытка создать Способ автоматизации процесса. Проблема с автоматизацией для этого заключается в том, что, когда я пытаюсь взглянуть на код несколько недель спустя ... вы не можете просто понять это на первый взгляд. Кроме того, если вы хорошо освоите Visual Studio и научитесь использовать такие вещи, как режим редактирования блоков и некоторые другие расширенные функции, вы можете быть весьма продуктивными.

//-----------------------------------------------------------------------------
// <copyright file="ShellForm.cs" company="DCOM Productions">
//     Copyright (c) DCOM Productions.  All rights reserved.
// </copyright>
//-----------------------------------------------------------------------------

string updateCommandText = string.Format("UPDATE `moh`.`moh` SET ageact = '{0}', branch = '{1}', cemetary = '{2}', citation = '{3}', citycement = '{4}', cdateact = '{5}', cdateaward = '{6}', cdatebirth = '{7}', cdatedeath = '{8}', namefirst = '{9}', namelast = '{10}', placeact = '{11}', placeenter = '{12}', presat = '{13}', presby = '{14}', rankact = '{15}', rankawd = '{16}', rankhigh = '{17}', synopsis = '{18}', unit = '{19}', war = '{20}', imgfile = '{21}' WHERE ID = '{22}'",
    /* {0}  */ uxAgeAct.Text.Replace("'", "''"),
    /* {1}  */ uxBranch.Text.Replace("'", "''"),
    /* {2}  */ uxCemetary.Text.Replace("'", "''"),
    /* {3}  */ uxCitation.Text.Replace("'", "''"),
    /* {4}  */ uxCityCemetary.Text.Replace("'", "''"),
    /* {5}  */ uxDateAct.Text.Replace("'", "''"),
    /* {6}  */ uxDateAward.Text.Replace("'", "''"),
    /* {7}  */ uxDateBirth.Text.Replace("'", "''"),
    /* {8}  */ uxDateDiceased.Text.Replace("'", "''"),
    /* {9}  */ uxNameFirst.Text.Replace("'", "''"),
    /* {10} */ uxNameLast.Text.Replace("'", "''"),
    /* {11} */ uxPlaceAct.Text.Replace("'", "''"),
    /* {12} */ uxPlaceEnter.Text.Replace("'", "''"),
    /* {13} */ uxPresentedAt.Text.Replace("'", "''"),
    /* {14} */ uxPresentedBy.Text.Replace("'", "''"),
    /* {15} */ uxRankAct.Text.Replace("'", "''"),
    /* {16} */ uxRankAwarded.Text.Replace("'", "''"),
    /* {17} */ uxRankHigh.Text.Replace("'", "''"),
    /* {18} */ uxSynopsis.Text.Replace("'", "''"),
    /* {19} */ uxUnit.Text.Replace("'", "''"),
    /* {20} */ uxWar.Text.Replace("'", "''"),
    /* {21} */ uxImgFile.Text.Replace("'", "''"),
    /* {22} */ dataRow["ID"].ToString());
1 голос
/ 16 сентября 2009

Хотя C # не может сделать это за вас, инструмент может помочь здесь.

Например, Resharper предупреждает вас, если в строке больше параметров, чем после строки. Я посмотрел, поддерживается ли переупорядочение параметров в Resharper, но в этом случае это не так (R # поддерживает изменение сигнатуры метода, но это не помогает).

Посмотрите на Code Rush от DevEx. Этот инструмент, скорее всего, имеет то, что вам нужно.

...