繁体   English   中英

C# 如何将字符串变量视为插值字符串?

[英]C# How to treat a string variable as interpolated string?

插值字符串很简单,只是一个带有 $ 符号的字符串前导。 但是,如果字符串模板来自您的代码之外怎么办。 例如,假设您有一个包含以下行的 XML 文件:

<filePath from="C:\data\settle{date}.csv" to="D:\data\settle{date}.csv"/>

然后可以使用 LINQ 到 XML 中读取属性的内容。

//assume the ele is the node <filePath></filePath>
string pathFrom = ele.Attribute("from").value;
string pathTo = ele.Attibute("to").value;
string date = DateTime.Today.ToString("MMddyyyy");

现在如何将date注入pathFrom变量和pathTo变量?


如果我可以控制字符串本身,事情就简单了。 我可以做var xxx=$"C:\data\settle{date}.csv"; 但是现在,我所拥有的只是我知道的包含占位符date的变量

字符串插值是编译器功能,因此不能在运行时使用。 从 scope 中的变量名称通常在运行时不可用这一事实中应该清楚这一点。

因此,您将不得不推出自己的替换机制。 这取决于您的确切要求,这里最好。

如果您只有一个(或很少有替代品),那就做

output = input.Replace("{date}", date);

如果可能的替换是一长串,最好使用

output = Regex.Replace(input, @"\{\w+?\}", 
    match => GetValue(match.Value));

string GetValue(string variable)
{
    switch (variable)
    {
    case "{date}":
        return DateTime.Today.ToString("MMddyyyy");
    default:
        return "";
    }
}

如果您可以获得 IDictionary<string, string> 将变量名称映射到值,则可以将其简化为

output = Regex.Replace(input, @"\{\w+?\}", 
    match => replacements[match.Value.Substring(1, match.Value.Length-2)]);

解决方案 1:
如果您能够更改 xml 模板上的某些内容,请将 {date} 更改为 {0}。

<filePath from="C:\data\settle{0}.csv" to="D:\data\settle{0}.csv" />

然后你可以像这样设置它的值。

var elementString = string.Format(element.ToString(), DateTime.Now.ToString("MMddyyyy"));

Output: <filePath from="C:\data\settle08092020.csv" to="D:\data\settle08092020.csv" />

解决方案 2:
如果您无法更改 xml 模板,那么这可能是我对 go 的个人课程。

<filePath from="C:\data\settle{date}.csv" to="D:\data\settle{date}.csv" />

像这样设置占位符。

element.Attribute("to").Value = element.Attribute("to").Value.Replace("{date}", DateTime.Now.ToString("MMddyyyy"));
element.Attribute("from").Value = element.Attribute("from").Value.Replace("{date}", DateTime.Now.ToString("MMddyyyy"));

Output: <filePath from="C:\data\settle08092020.csv" to="D:\data\settle08092020.csv" />

我希望它有所帮助。 亲切的问候。

你不能直接; 编译器将您的:

string world = "world";
var hw = $"Hello {world}"

变成这样的东西:

string world = "world";
var hw = string.Format("Hello {0}", world);

(根据情况选择concat、format或formattablestring)


您可以自己进行类似的过程,将“{date”替换为“{0”并将日期作为字符串格式的第二个参数等。

如果您将原始字符串视为用户输入字符串(或编译器未处理的任何内容以替换占位符,那么问题很简单 - 只需使用String.Replace()替换占位符{date} ,您希望的日期值现在后续问题是:您确定编译器在编译期间没有替换它,并且在运行时保持不变以进行处理?

字符串插值允许开发人员将变量和文本组合成一个字符串。

示例 创建了两个 int 变量:foo 和 bar。

int foo = 34;
int bar = 42;

string resultString = $"The foo is {foo}, and the bar is {bar}.";

Console.WriteLine(resultString);

Output:

The foo is 34, and the bar is 42.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM