【问题标题】:C# Build a string evaluating another string as the template/rule/format to do it [closed]C#构建一个字符串,评估另一个字符串作为模板/规则/格式来执行它[关闭]
【发布时间】:2016-10-08 22:33:07
【问题描述】:

我正在考虑根据用户所属的类别构建某种用户名的应用程序。当我尝试从表中包含的规则生成此用户名时,问题就开始了。

例子:

数据数据表

| ID | Name  | City   | Level  | Rule |
|----|-------|--------|--------|------|
| 1  | John  | London |   A    |  1   |
| 2  | Chris | Paris  |   C    |  1   |
| 3  | Anna  | Madrid |   B    |  3   |
| 4  | Marie | Roma   |   C    |  2   |

规则数据表

| Rule | Format                      |
|------|-----------------------------|
|  1   | "Name + City"               |
|  2   | "Name[0] + City[0] + Level" |
|  3   | "Name[0] + \".\" + City"    |

我想得到一个最终结果:

| ID | Username   |
|----|------------|
| 1  | JonhLondon |
| 2  | ChrisParis |
| 3  | A.Madrid   |
| 4  | MRC        |

所以我在想是否有一个很好的方法可以使用规则表中包含的字符串作为模板来构建用户名:

string Name = dtData[i].Name;
string City = dtData[i].City;
string Level = dtData[i].Level;
string u = SomeGreatMethodToEvaluate(dtRules[dtData[i].Rule].Format);
dtFinal[i].Username = u;

对不起,如果我解释得不够好,但这对我来说是一件棘手的事情。

【问题讨论】:

  • 我认为你已经很好地解释了你的问题,问题是我认为没有论文就无法回答这个问题 - 这完全太宽泛了。
  • 如果您需要模板,Razor 非常有效nuget.org/packages/RazorEngine,如果您想编写自己的模板语法超出了这里的答案范围,祝您好运。如果任务很简单,只需使用格式字符串。

标签: c# string string-concatenation


【解决方案1】:

我会尝试利用String.Format 来做到这一点。您将格式字符串存储在数据库中并以一致的方式传递参数,例如名称,城市,级别,规则。像"Name + City" 这样的模式变得非常简单,它只需要格式字符串"{0}{1}"

String.Format 不支持开箱即用的Strings 的一部分,但您可以使用IFormatProvider 和自定义类来包装您的字符串来扩展其功能。相关问题中有很好的指点:Can maximum number of characters be defined in C# format strings like in C printf?

【讨论】:

  • 我想我会尝试这样做以避免在服务器中安装一些外部包,但我应该看看如何使用这些模式。无论如何,我必须先创建自己的类来包装字符串并分析规则。谢谢!
【解决方案2】:

DotLiquid 是一个模板引擎,可以很好地适应这里。使用 DotLiquid,您的规则基本上变成了模板,然后您将数据输入到模板中,从而产生所需的结果:

1. {{ name }}{{ city }}
2. {{ name | first | upcase }}{{ city | first | upcase }}{{ level }}
3. {{ name | first | upcase }}.{{ city }}

【讨论】:

    【解决方案3】:

    当您使用自己的规则集时,您必须自己解析它们。 但是,当您使用一组标准规则时,例如 EBNF,那么您可能会找到 herehere 的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 2014-01-28
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多