C#LINQ邮编:找到至少一对

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。