用c#中的Dictionary替换字符串中的单词

时间:2013-11-11 05:13:31

标签: c# dictionary replace .net-4.5

我有一个像这样的简单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给定数组的整个长度!

4 个答案:

答案 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);
}