C# 用c中字典中的值替换字符串中的单词#

C# 用c中字典中的值替换字符串中的单词#,c#,dictionary,replace,.net-4.5,C#,Dictionary,Replace,.net 4.5,我有一本简单的字典如下: var outputString = string.Empty; fruitString.ToArray().ToList().Foreach(item => { if (fruitDictionary.ContainsKey(item)) { outputString = outputString + fruitDictionary[item]; } var-fruitDictionary=新字典{Apple,Fruit},{Orange,Fruit},

我有一本简单的
字典
如下:

var outputString = string.Empty;
fruitString.ToArray().ToList().Foreach(item =>
{
if (fruitDictionary.ContainsKey(item))
{
 outputString = outputString + fruitDictionary[item];

} 
var-fruitDictionary=新字典{Apple,Fruit},{Orange,Fruit},{Spinach,Greens}

我有一根像

var-fruitString=苹果橙菠菜橙苹果菠菜

如何将该句子中出现的所有特定单词替换为字典中匹配的
单词

(即)上述句子应为
果蔬水果

任何想法都非常感谢

编辑:

我试过这样的方法:

var outputString = string.Empty;
fruitString.ToArray().ToList().Foreach(item =>
{
if (fruitDictionary.ContainsKey(item))
{
 outputString = outputString + fruitDictionary[item];

} 
有什么最佳解决方案吗?上面的代码不是最优的,因为它确实遍历给定数组的整个长度

简单地说:

var output = new StringBuilder(fruitString);

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

var result = output.ToString();
这只需使用您的
结果字符串初始化
StringBuilder
,并在
字典中迭代,将找到的每个键替换为值。

尝试以下解决方案:

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));
    }
}
内部类程序
{
公共静态void Main(字符串[]args)
{
var futuredictionary=新字典
{
{“苹果”,“水果”},
{“橙色”、“水果”},
{“菠菜”、“绿色蔬菜”}
};
var fruitString=“苹果橙菠菜橙苹果菠菜”;
var result=string.Join(“”,
Split(“”).Select(i=>fruitDictionary.ContainsKey(i)?fruitDictionary[i]:i));
}
}

如果您有长字符串和大字典,则查找和替换基于的解决方案的速度会更快。

一些平滑的代码:

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
用于
字符串。连接结果的
参数。考虑到它是线性的,它应该适当地扩展

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

受和@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);
}
使用系统集合;
void Main()
{
var args=新字典{
{“水果1”,“苹果”},
{“水果2”,“橙色”},
{“绿色”、“菠菜”}
};
var输出=Regex.Replace(
“嗨,我最喜欢的水果是{果1}和{果2}。我喜欢{木瓜}”,
@“{(\w+\},//替换由{和}包围的任何文本
m=>
{
字符串值;
返回args.TryGetValue(m.Groups[1].Value,out值)?值:“null”;
}
);
控制台写入线(输出);
}

不管你怎么做,我认为如果不遍历
结果字符串
,你就不可能做到。你需要在某个时候对照字符串中的每个单词检查字典中的每个单词。我们谈论的是多大程度的检查?
水果字典
中有数千条词条,而
水果串
中有数千个单词?@mellamokb:这一点很好。在我的例子中,字典的大小很小,但是字符串的大小较长。在短字符串上工作得很好,在很长的字符串上,你必须考虑这是O(n*m),n是字典条目的数量,m是字符串中的项数。我唯一关心的是大型词典的性能,在大型词典中,遍历整个词典并搜索整个字符串中的每个条目都会很慢。基于查找的方法会更快。不过这个案子没问题@碎玻璃真的。。但我正在努力想其他的方法。至少在这个解决方案中,每次迭代都不会创建字符串。如果不知道任何关于用例的具体细节,就很难假设。谢谢但是,我担心这里的ToList()参数:对于非常长的字符串,它必须首先拆分,将其转换为数组,然后转换为列表,然后执行联接。。这让我很不安:(对不起,收费表不是必需的。我已经编辑了这篇文章,谢谢你指出它!@nowHewomustnotbenamed别担心-衡量-实施这两种方法,看看什么效果最好