C#LINQ邮编:找到至少一对
问题描述:
我有两个数组,我想知道如果某些条件满足至少有一对来自列表的。C#LINQ邮编:找到至少一对
最小再现代码:
var boxTypes = new string[] { "Banana", "Apple", "Apple", "Banana" };
var boxSizes = new int[] { 31, 16, 35, 8 };
int bigBoxSize = 20;
bool hasBigAppleBox =
boxTypes.Zip(boxSizes,
(type, size) => (type == "Apple" && size >= bigBoxSize) ? 1 : 0)
.Sum() > 0;
此代码遍历所有对。但是一对就足够了。
任何建议,以改善此代码?
答
简短的回答:使用Any(result => result > 1)
龙答:您使用的Sum()
是要评估整个集合,并使用Any()
直到第true
条件得到满足,只会评价。
例子:
boxTypes.Zip(boxSizes,
(type, size) => (type == "Apple" && size >= bigBoxSize) ? 1 : 0)
.Any(result => result == 1)
这也是值得注意的是,你的(type == "Apple" && size >= bigBoxSize) ? 1 : 0
谓词可以在这种情况下被简化为仅仅是type == "Apple" && size >= bigBoxSize)
。
有了这个,你的说法就变成了:
boxTypes.Zip(boxSizes,
(type, size) => type == "Apple" && size >= bigBoxSize)
.Any()
答
你能做到这样的:
bool hasBigAppleBox =
boxTypes.Zip(boxSizes,
(type, size) => type == "Apple" && size >= bigBoxSize)
.Any(x => x);
基本上,对于每一对,这个代码选择该对的条件的结果。这(Zip
方法)返回IEnumerable<bool>
。 Any(x => x)
会在枚举中遇到第一个true
时返回true。