2013-03-13 37 views
1

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

例子:

我有一个列表:

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}该项目的名称是{Name}。它的描述是{Description}。它具有值{值}和状态{状态}。

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

+0

您是否考虑过使用String.Replace,String.Format或Regex?密钥(名称,说明,价值和状态)是否已修复? – 2013-03-13 08:44:52

+0

除了_pretty common_这个事实,恐怕你必须编写你自己的解析例程。您必须制定规则,检查类型转换等。是不是要求使用预定义GUI的数据更容易? – 2013-03-13 08:46:04

+0

String.Replace做的伎俩。 @JohnWillemse:好的,我认为这是一个普遍的特征可能是一种误解。我在自动化领域工作,在这些领域中,您经常使用参数来创建信息字符串,这些参数对我来说很常见。 :) – twittfort 2013-03-13 14:03:09

回答

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); 
+0

这正是我需要的。如果找到该参数,请将其替换。对我来说很完美。 – twittfort 2013-03-13 13:59:24

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); 
+0

这是可以的,如果你在开发过程中建立字符串。但我想给用户设计自己的字符串的可能性。参数的位置和数量可能会有所不同。 – twittfort 2013-03-13 14:00:50

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

还是我错过了点?

2

我怀疑你想用你的对象列表中的值替换占位符,例如{ID}{Name}。你可以使用正则表达式与模式,如

\{(?<key>[A-Za-z]+)\} 

这将找到的{something}所有实例,并允许您以从你的列表中的值提取something

使用的Regex.Match超载这需要输入字符串和MatchEvaluator委托,将让你得到正确的价值:

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或自定义对象,或任何其他容器的属性。

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

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); 
    } 
} 
相关问题