2014-02-28 305 views
1

我有一个字符串替换字符串字符

"#1#+#2#+#3#*1.23+#4#/2+#5#" 

我有对象的列表作为

  • 1, “ABC”
  • 2, “DEF”
  • 3,“ GHI“
  • 4,”JKL“
  • 5,”MNO“

我需要一个新字符串,其中的#1#替换为 “ABC”,#2#与DEF等替代

所需的字符串:

"ABC+DEF+GHI*1.23+JKL/2+MNO" 

如何获得替换有效执行?

编辑:目前我正在循环为列表中的每个和使用替换字符串,但我相信它不是非常有效的内存。一定会有更好的办法。

+1

迭代你的列表并调用每个项目的'string.Replace'如何?你尝试过吗?你尝试过别的吗? – Jon

+0

@Jon _effectively_是关键词。多次替换导致多个临时字符串,并且由于垃圾收集导致内存和CPU的大量浪费。 –

+3

为什么不用.NET的占位符替换#1#,例如{0},{1}?在这种情况下,您可以简单地使用String.Format来执行替换 –

回答

-1

两个答案:

  1. 简单。对列表中的每个对象使用string.Replace(...)方法。但是对于有很多替换的长字符串,它会变慢。
  2. 创建StringBuilder。迭代你的字符串复制字符到stringbuilder,直到遇到替换子字符串。在StringBuilder中插入替换对象并继续迭代您的输入字符串。返回StringBuilder.ToString()
+0

StringBuilder也有一个Replace函数,但它只是改变自己而不是创建新的副本。 –

+0

@ColinMackay如果StringBuilder在替换之前没有足够的容量,它会在每次容量耗尽时复制它内部的字符串。 – Redwan

+0

是的,但它不会*每*次。应用更多容量的算法会过度提供新容量,以便下次不一定需要执行复制。如果要通过合并格式字符串和每个替换字符串的长度来完成一些额外的工作,您还可以在创建StringBuilder时指明容量,在这种情况下,不需要复制其内部缓冲区到一个新的更大的缓冲区。 –

0

从数据库中读取此行。阅读并更改#为{或}。如果是第一个#,那么{,如果它是第二个},依此类推。那么结果会像下面的文本变量;)

string text = "{0}+{1}+{2}*1.23+{3}/2+{4}"; 

和你有一个数组:

string[] replaces = {"ABC", 
"DEF", 
"GHI", 
"JKL", 
"MNO"}; 

你可以做soemthing,如:

string result = string.Format(text, replaces); 
+1

第一个字符串来自数据库,所以我不建立它。但是,我可能会在这里直接获取数据库的更改。这些整数的顺序并不总是0,1,2 ...但可以是任何东西 – Nuts

+0

然后是构建总是相同的方式,你可以做一些类似的,用int,然后读取字符串,如果是第一个#你发现,改变{,如果是第二次改变},等等,那么最终的输出将会像我的答案中的“文本”;) –

1

如果性能不是一个大问题,你可能想要使用正则表达式:

string input = "#1#+#2#+#3#*1.23+#4#/2+#5#"; 
var replaces = new List<string> { "ABC", "DEF", "GHI", "JKL", "MNO" }; 

string result = Regex.Replace(input, "#[0-9]+#", match => 
{ 
    string number = match.Value.Substring(1, match.Value.Length - 2); 
    int index = int.Parse(number) - 1; 
    return replaces[index]; 
}); 

它的工作原理“#”之间,即使数字:

  • 不是为了
  • 出现多次
  • 有一个以上的数字

之间的数量N' #'必须对应于replaces列表中的第(N-1)个索引。 您可能想要添加一些错误处理。