在c#中允许用户定义的字符串

时间:2013-03-13 08:42:08

标签: c# string parsing variables parameterized

我问的是一个很常见的功能,我找不到任何相关的信息。我想允许程序的用户使用程序中的变量创建自定义字符串。

示例:

我有一个清单:

ID   Name     Description       Value      Status
0    name 0   beschreibung 0    Wert 0     Status 0
1    name 1   beschreibung 1    Wert 1     Status 1
2    name 2   beschreibung 2    Wert 2     Status 2
3    name 3   beschreibung 3    Wert 3     Status 3
4    name 4   beschreibung 4    Wert 4     Status 4
5    name 5   beschreibung 5    Wert 5     Status 5
6    name 6   beschreibung 6    Wert 6     Status 6
7    name 7   beschreibung 7    Wert 7     Status 7
8    name 8   beschreibung 8    Wert 8     Status 8
9    name 9   beschreibung 9    Wert 9     Status 9

现在用户应该能够定义自定义字符串,如:

ID {ID}的项目名称为{名称}。它的描述是{Description}。它具有值{Value}和状态{Status}。

我可以为这些字符串编写自定义解析例程,但我希望找到该任务的标准解决方案。有什么建议吗?

5 个答案:

答案 0 :(得分:3)

C#(以及一般的.NET)中字符串格式化的标准解决方案是使用the String.Format method。所以你可以这样做:

string reult = string.Format("The Name of the Item with the Id {0} is {1}. It's Description is {2}. It has the Value {3} and the Status {4}.",
       id, name, description, value, status);

答案 1 :(得分:2)

我怀疑您想要使用对象列表中的值替换{ID}{Name}等占位符。您可以使用带有

等模式的正则表达式
\{(?<key>[A-Za-z]+)\}

会找到{something}的所有实例,并允许您提取something以便从列表中获取值。

使用带有输入字符串和MatchEvaluator委托的Regex.Match重载,可以获得正确的值:

var myObject = new Dictionary<string,string>(){
    {"ID","1"},  
    {"Name","Bob Jones"},
    {"Description","A very nice man"},
    {"Value","1000"},
    {"Status","New"},
};
var regex = new Regex(@"\{(?<key>[A-Za-z]+)\}");
var input = "The Name of the Item with the Id {ID} is {Name}. It's Description is {Description}. It has the Value {Value} and the Status {Status}.";
string result = regex.Replace(input, m => myObject[m.Groups["key"].Value]);

Console.WriteLine(result);

实例:http://rextester.com/FLGTQW95860

该示例中的字典只是为了演示正则表达式的用法 - 没有理由不能成为DataRow或自定义对象,或属性的任何其他容器。

当然这个解决方案不包含任何错误处理(例如属性不存在的占位符),如果你允许用户指定字符串,我怀疑你会想要包含它。 / p>

答案 2 :(得分:1)

你的意思是:

var x = String.Format("The Name of the Item with the Id {0} is {1}. It's Description is {2}. It has the Value {3} and the Status {4}.",object.Id, object.Name, object.Description, object.Value, object.Status); 

还是我错过了这一点?

答案 3 :(得分:0)

您可以定义自己的类并覆盖ToString:

public class Program
{
    static void Main(string[] args)
    {
        var aString = new MyString() {Description = "desc", Id = 1, Name = "Ja", Status = "st", Value = "Val"};

        var myStrings = new List<MyString>() {aString};


        foreach (MyString myString in myStrings)
        {
            //The Name of the Item with the Id 1 is Ja. It's Description is desc. It has the Value val and the Status st.
            var outputStringVal = myString.ToString();
            //
        }
    }
}

public class MyString 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Value { get; set; }
    public string Status { get; set; }

    public override string ToString()
    {
        return String.Format("The Name of the Item with the Id {0} is {1}. It's Description is {2}. It has the Value {3} and the Status {4}.", this.Id, Name, Description, Value, Status);
    }
}

答案 4 :(得分:0)

您可以允许用户在字符串中使用指定的“变量”。例如:

var userstring = "The Name of the Item with the Id {ID} is {Name}. It's Description is {Description}. It has the Value {Value} and the Status {Status}.";
var result = userstring.Replace("{ID}", Id).Replace("{Name}", Name).Replace("{Description}", Description).Replace("{Value}", Value).Replace("{Status}", Status);