【问题标题】:comparison goes faulty c# Dictionary<String, string[]>比较出错 c# Dictionary<String, string[]>
【发布时间】:2017-02-20 01:06:21
【问题描述】:

大家好,

我有一个Dictionary&lt;String, String[])&gt;,带有一个键 => 值示例,如下所示:

{ "Eten/drinken", new string[] { "canteen", "mcdonald's", "mimi" } }

我需要将字符串 part 与 Dictionary 的值之一进行比较:

 if (categories.Any(x => x.Value.Contains(part))) {
        category = categories.FirstOrDefault(x => x.Value.Contains(part)).Key;
 } 

在一种情况下part = "mcdonald's veghel veghel",这使得与字典值的比较返回false

为什么是假的? "mcdonald's veghel veghel" 确实包含 mcdonald's 并且零空间比较确实按照应有的方式进行。

【问题讨论】:

  • 因为它们都不包含"mcdonald's veghel veghel" 子字符串。
  • 为什么是假的? -- 好吧,你将"mcdonald's veghel veghel"{ "canteen", "mcdonald's", "mimi" } 进行了比较。如果您想比较该值是否包含来自part 变量的任何单词,您需要将您的"mcdonald's veghel veghel" 拆分为{"mcdonald's", "veghel"},然后检查它们是否都存在于字典的数组中。..
  • 有趣的是,这实际上是我以前在我的代码中所做的,但认为它太狡猾了。不过,谢谢你让我明白了!

标签: c# arrays linq dictionary


【解决方案1】:

lambda 中的表达式x.Value.Contains(part) 表示{"canteen", "mcdonald's", "mimi"} 的任何元素都包含字符串"mcdonald's veghel veghel",即false。您想要条件的倒数,即长字符串 part 包含您列表中的任何关键字:

categories.Any(x => x.Value.Any(s => part.Contains(s)))

【讨论】:

  • @zerkms 你是对的,需要另一个Any
  • 谢谢!快速响应和很好的建议
  • 它仍然只检查是否存在,实际上 op 正在使用 .Key 对应的项目。我认为您必须进行一些编辑才能使其完美。谢谢
【解决方案2】:

实际上String.Contains 方法将检查给定字符串中是否存在任何指定的子环。不幸的是,没有包含给定字符串的x.Value,而给定值包含 x.Value 的项,因此您必须更改查询,如下所示:

var collectionResult = categories.FirstOrDefault(x => x.Value.Any(s=> part.Contains(s)));
if(collectionResult != null)
{
   var selectedKey =  collectionResult.Key;
}

【讨论】:

  • 好主意,可以这样做,而不是拆分部分。
  • 感谢您的建议,感谢您的快速回复!
  • @MwBakker:不用提了,我们都是来帮忙的。很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2012-09-21
相关资源
最近更新 更多