我有一个像这样的简单dictionary
:
var fruitDictionary = new Dictionary<string, string> {Apple,Fruit}, {Orange, Fruit}, {Spinach, Greens}
我有一个像
这样的字符串 var fruitString = Apple Orange Spinach Orange Apple Spinach
如何用字典中的matching-word
替换该句子中所有出现的特定单词?
(即)上面的句子应该是Fruit Fruit Greens Fruit Fruit Fruit
?
非常感谢任何想法。
编辑:
我试过这样的事情:
var outputString = string.Empty;
fruitString.ToArray().ToList().Foreach(item =>
{
if (fruitDictionary.ContainsKey(item))
{
outputString = outputString + fruitDictionary[item];
}
对此有什么最佳解决方案吗?上面的代码不是最优的,因为它确实traversing
给定数组的整个长度!
答案 0 :(得分:7)
简单地:
var output = new StringBuilder(fruitString);
foreach (var kvp in fruitDictionary)
output.Replace(kvp.Key, kvp.Value);
var result = output.ToString();
这只是使用您的StringBuilder
初始化fruitString
,并对Dictionary
进行迭代,将其找到的每个键替换为该值。
答案 1 :(得分:3)
试试这个解决方案:
internal class Program
{
public static void Main(string[] args)
{
var fruitDictionary = new Dictionary<string, string>
{
{"Apple", "Fruit"},
{"Orange", "Fruit"},
{"Spinach", "Greens"}
};
var fruitString = "Apple Orange Spinach Orange Apple Spinach";
var result = string.Join(" ",
fruitString.Split(' ').Select(i => fruitDictionary.ContainsKey(i) ? fruitDictionary[i] : i));
}
}
如果您有长字符串和大字典,那么基于查找和替换的解决方案会更快。
答案 2 :(得分:3)
一些流畅的代码:
var result = string.Join(" ",
string.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(
i => fruitDictionary.ContainsKey(i) ? fruitDictionary[i] : i);
应该是O(n*2m)
- 其中n
是要分割它的字符串的遍历和2m
- 一个m
用于通过{{1进行单词替换的遍历另一个Select()
用于结果的m
参数。鉴于它是线性的,它应该适当地扩展。
要进一步缩放,如果您的输入字符串不是唯一的,请将此方法的输出缓存在string.Join
的输入中 - 对于重复输入,这将产生大约Dictionary<string, string>
。
答案 3 :(得分:2)
受到MSDN Replace MatchEvaluator Delegate和@ Haney的回答的启发 但没有不切实际的分裂&#39;
using System.Collections;
void Main()
{
var args = new Dictionary<string, string> {
{"Fruit1","Apple"},
{"Fruit2", "Orange"},
{"Greens", "Spinach"}
};
var output = Regex.Replace(
"Hi, my Fav fruits are {Fruit1} and {Fruit2}. I like {Papaya}",
@"\{(\w+)\}", //replaces any text surrounded by { and }
m =>
{
string value;
return args.TryGetValue(m.Groups[1].Value, out value) ? value : "null";
}
);
Console.WriteLine(output);
}