2016-07-15 56 views
1

我有兩個數組,我想知道如果某些條件滿足至少有一對來自列表的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; 

此代碼遍歷所有對。但是一對就足夠了。

任何建議,以改善此代碼?

回答

2

簡短的回答:使用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() 
3

你能做到這樣的:

bool hasBigAppleBox = 
    boxTypes.Zip(boxSizes, 
       (type, size) => type == "Apple" && size >= bigBoxSize) 
      .Any(x => x); 

基本上,對於每一對,這個代碼選擇該對的條件的結果。這(Zip方法)返回IEnumerable<bool>Any(x => x)會在枚舉中遇到第一個true時返回true。