c# - 搜索字符串数组中包含的字典键

标签 c# linq dictionary

我有一个字符串列表,其中每个项目都是描述技能的自由文本,所以看起来有点像这样:

List<string> list = new List<string> {"very good right now", "pretty good",
 "convinced me that is good", "pretty medium", "just medium" .....}

我想保留这些免费文本的用户评分。所以现在,我使用条件:

foreach (var item in list)
        {
            if (item.Contains("good"))
            {
                score += 2.5;
                Console.WriteLine("good skill, score+= 2.5, is now {0}", score);
            }
            else if (item.Contains(low"))
            {
                score += 1.0;
                Console.WriteLine("low skill, score+= 1.0, is now {0}", score);
            }

        }

假设将来我想使用字典来进行分数映射,例如:

Dictionary<string, double> dic = new Dictionary<string, double>
{ { "good", 2.5 }, { "low", 1.0 }};

在字典值和字符串列表之间交叉的好方法是什么?我现在看到的方式是做一个嵌套循环:

foreach (var item in list)
        {
            foreach (var key in dic.Keys)
                if (item.Contains(key))
                    score += dic[key];
        }

但我确信有更好的方法。至少速度更快或更赏心悦目 (LINQ) 更好。

谢谢。

最佳答案

var scores = from item in list
             from word in item.Split()
             join kvp in dic on word equals kvp.Key
             select kvp.Value;

var totalScore = scores.Sum();

注意:您当前的解决方案检查列表中的项目是否包含字典中的键。但即使字典中的键是项目中某个单词的一部分,它也会返回 true。例如。 “follow the rabbit” 包含 “low”。将项目拆分为单词可以解决此问题。

此外,LINQ join 在内部使用哈希集来搜索第二个序列中的第一个序列项。当您枚举字典的所有条目时,这为您提供了 O(1) 查找速度而不是 O(N)。

关于c# - 搜索字符串数组中包含的字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44271338/

相关文章:

c# - 如何动态组合条件?

python - python中的命名字典

python - 将 if-elseif 语句转换为字典

c# - 使用 ASP.net 将 Highcharts 连接到数据库

c# - 将数据库上下文移动到 DAL 类库后的 .Net Core 2.0 Web Api 循环依赖

c# - Linq 的 except 方法不适用于字节值

c# - 是否可以使用 System.Data.Linq.Mapping.FunctionAttribute 制作一个通用方法来代替三种方法?

python - 仅在赋值时如何实现嵌套字典的自动生成?

c# - 我可以在 WPF 中使用一种样式和多种 TargetType 吗?

c# - 动态 Linq select 语句