【问题标题】:Search IList of KeyValuePairs for two keys在 IList of KeyValuePairs 中搜索两个键
【发布时间】:2016-06-29 21:06:15
【问题描述】:

我正在对要验证项目属性的代码进行临时修复。它们是“swatchImageUrl”和“swatchVariantAttribute”。如果提供了其中一个,则必须提供另一个。我将在其中检查值的字典。所以我有以下内容:

if((transformedValues.Any(t => t.Key.Equals("swatchImageUrl")) &&
   !transformedValues.Any(t => t.Key.Equals("swatchVariantAttribute"))) ||
   (transformedValues.Any(t => t.Key.Equals("swatchVariantAttribute")) &&
   !transformedValues.Any(t => t.Key.Equals("swatchImageUrl"))))
   {
       // throw an error here
   }

这感觉很笨拙并且可能效率低下(transformedValues 可能是一个非常大的列表,我的理解是 .Any() 最终会枚举整个列表,如果没有的话)但我想不出更好的方法来做到这一点。 'transformedItems' 是字符串键值对的 IList(所以我不能使用 .ContainsKey 等)

是否有一些我想念的更简洁的方法?非常感谢任何见解。

【问题讨论】:

  • if (transformedValues.Any(t => t.Key.Equals("swatchImageUrl")) != transformedValues.Any(t => t.Key.Equals("swatchVariantAttribute"))) { /*...*/ }
  • 一个经典的例子,当人们使布尔表达式比需要的更困难时。您的陈述看起来像:如果 A 为真,B 为假,或者 A 为假或 B 为真,而实际上您的意思是:如果 A 和 B 不都是真或不都是假的,或者只是如果 A != B
  • 谢谢你们!我知道我想太多了。 @HaraldDutch,是的,这是一个使事情变得比必要更困难的经典例子。有时您需要先离开,然后再回来并意识到事情真的很简单。

标签: linq list keyvaluepair


【解决方案1】:

以防万一其他人也有类似的大脑冻结。正如 Ash 所指出的,以更好的方式做到这一点的明显方法是;

if(transformedValues.Any(t => t.Key.Equals("swatchImageUrl")) != transformedValues.Any(t => t.Key.Equals("swatchVariantAttribute"))) 
{ /*...*/ }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 2011-01-12
    • 2010-10-14
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多