Можно ли включить переменную C # в строковую переменную без использования конкатенатора? - PullRequest
10 голосов
/ 12 апреля 2011

Позволяет ли .NET 3.5 C # включать переменную в строковую переменную без необходимости использовать + concatenator (или, если на то пошло, string.Format ()).

Например (в псевдо я использую символ $, чтобы указать переменную):

DateTime d = DateTime.Now;
string s = "The date is $d";
Console.WriteLine(s);

Выход:

Дата: 4/12/2011 11:56:39

Редактировать

Из-за нескольких ответов, в которых предлагался string.Format (), я могу только предположить, что мой оригинальный пост не был понятным, когда я упомянул " ... (или string.Format (), если на то пошло ) ». Чтобы было ясно, я хорошо знаю метод string.Format (). Однако в моем конкретном проекте, над которым я работаю, string.Format () мне не помогает (на самом деле он хуже, чем + concatenator).

Кроме того, я предполагаю, что большинство / все вы задаетесь вопросом, каков мотив моего вопроса (полагаю, я чувствовал бы то же самое, если бы я прочитал свой вопрос как есть).

Если вы один из любопытных, вот суть этого:

Я создаю веб-приложение, работающее на устройстве Windows CE. Благодаря тому, как работает веб-сервер, я создаю весь контент веб-страницы (css, js, html и т. Д.) В строковой переменной. Например, мой управляемый код .cs может иметь что-то вроде этого:

string GetPageData()
    {
    string title = "Hello";
    DateTime date = DateTime.Now;

    string html = @"
    <!DOCTYPE html PUBLIC ...>
    <html>
    <head>
        <title>$title</title>
    </head>
    <body>
    <div>Hello StackO</div>
    <div>The date is $date</div>
    </body>
    </html>
    ";

}

Как вы можете видеть, возможность указывать переменную без необходимости объединять ее немного упрощает, особенно когда содержимое увеличивается в размере.

Ответы [ 13 ]

12 голосов
/ 12 апреля 2011

Нет, к сожалению, C # не является PHP.
С другой стороны, C # - это не PHP.

8 голосов
/ 13 апреля 2011

Почти с небольшим методом расширения.

static class StringExtensions
{
    public static string PHPIt<T>(this string s, T values, string prefix = "$")
    {
        var sb = new StringBuilder(s);
        foreach(var p in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            sb = sb.Replace(prefix + p.Name, p.GetValue(values, null).ToString());
        }
        return sb.ToString();
    }
}

А теперь мы можем написать:

string foo = "Bar";
int cool = 2;

var result = "This is a string $foo with $cool variables"
             .PHPIt(new { 
                    foo, 
                    cool 
                });

//result == "This is a string Bar with 2 variables"
3 голосов
/ 08 мая 2014

Основываясь на великолепном ответе @JesperPalm, я нашел другое интересное решение, которое позволяет использовать аналогичный синтаксис, как в обычном методе string.Format:

public static class StringExtensions
{
    public static string Replace<T>(this string text, T values)
    {
        var sb = new StringBuilder(text);
        var properties = typeof(T)
            .GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .ToArray();

        var args = properties
            .Select(p => p.GetValue(values, null))
            .ToArray();

        for (var i = 0; i < properties.Length; i++)
        {
            var oldValue = string.Format("{{{0}", properties[i].Name);
            var newValue = string.Format("{{{0}", i);

            sb.Replace(oldValue, newValue);
        }

        var format = sb.ToString();

        return string.Format(format, args);
    }
}

Это дает вам возможность добавить обычное форматирование:

var hello = "Good morning";
var world = "Mr. Doe";
var s = "{hello} {world}! It is {Now:HH:mm}."
    .Replace(new { hello, world, DateTime.Now });

Console.WriteLine(s); // -> Good morning Mr. Doe! It is 13:54.
3 голосов
/ 12 апреля 2011
string output = "the date is $d and time is $t";
output = output.Replace("$t", t).Replace("$d", d);  //and so on
3 голосов
/ 12 апреля 2011

Нет, это не так. Есть способы обойти это, но они побеждают цель. Самая простая вещь для вашего примера -

Console.WriteLine("The date is {0}", DateTime.Now);
2 голосов
/ 12 апреля 2011

Короткий и простой ответ: нет!

0 голосов
/ 01 декабря 2014

Поскольку C # 6.0 , вы можете написать строку "The title is \{title}", которая делает именно то, что вам нужно.

0 голосов
/ 13 апреля 2011

Если вы просто пытаетесь избежать объединения неизменяемых строк, вам нужно: StringBuilder .

Использование:

string parameterName = "Example";
int parameterValue = 1;
Stringbuilder builder = new StringBuilder();
builder.Append("The output parameter ");
builder.Append(parameterName);
builder.Append("'s value is ");
builder.Append(parameterValue.ToString());
string totalExample = builder.ToString();
0 голосов
/ 12 апреля 2011

Как насчет использования шаблонизатора T4?

http://visualstudiomagazine.com/articles/2009/05/01/visual-studios-t4-code-generation.aspx

0 голосов
/ 12 апреля 2011

string.Format (и аналогичные функции форматирования, такие как StringBuilder.AppendFormat) - лучший способ сделать это с точки зрения гибкости, практики кодирования и (обычно) производительности:

string s = string.Format("The date is {0}", d);

Вы также можете указать формат отображения вашего DateTime, а также вставить более одного объекта в строку. Проверьте страницу MSDN в строке. Метод формата .

Некоторые типы также имеют перегрузки к своим ToString методам, которые позволяют указывать строку формата. Вы также можете создать метод расширения для string, который позволит вам указать формат и / или синтаксический анализ синтаксиса, подобный этому.

...