3

我有一个简单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

4 回答 4

10

简单地:

var output = new StringBuilder(fruitString);

foreach (var kvp in fruitDictionary)
    output.Replace(kvp.Key, kvp.Value);

var result = output.ToString();

这只是StringBuilder用您的初始化 a fruitString,然后遍历Dictionary,用值替换它找到的每个键。

于 2013-11-11T05:18:34.143 回答
3

一些流畅的代码:

var result = string.Join(" ", 
    string.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(
        i => fruitDictionary.ContainsKey(i) ? fruitDictionary[i] : i);

应该是O(n*2m)-n字符串的遍历在哪里拆分它2m- 一个m用于执行单词替换的遍历,Select()另一个m用于string.Join结果参数。鉴于它是线性的,它应该可以适当地扩展。

为了进一步扩展,如果您的输入字符串不是唯一的,请将此方法的输出缓存到 a 中的输入Dictionary<string, string>- 这将大致产生O(1)重复输入。

于 2013-11-11T05:30:47.957 回答
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));
    }
}

如果您有长字符串和大字典,这将比基于查找和替换的解决方案更快。

于 2013-11-11T05:21:44.583 回答
3

MSDN Replace MatchEvaluator Delegate和 @Haney 的回答启发,但没有不切实际的“拆分”。

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);
}
于 2016-03-29T06:42:22.540 回答