C#构建一个字符串,评估另一个字符串作为模板/规则/格式来完成它

时间:2016-06-08 15:00:32

标签: c# string string-concatenation

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

示例:

Data DataTable

| 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   |

规则DataTable

| 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;

对不起,如果我没有解释它已经足够好了,但这对我来说很棘手。

3 个答案:

答案 0 :(得分:2)

我会尝试利用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?

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

当您使用自己的一套规则时,您必须自己解析它们。 但是,当您使用一组标准规则(例如EBNF)时,您可能会发现herehere