【发布时间】: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