2016-03-26 200 views
0

查詢:0 4 1 0 0的foreach在的foreach C#

secQuery:1 1 0 0 3

我需要比較元素:0和1,4和1,1和0,0和0 ,0和3. 但突破停止我的第二個foreach。

我試試這個:

foreach (var a in query) 
{ 
    bool flag = false; 
    foreach (var b in secQuery) 
    { 
     if (b > a) 
     { 
      count++; 
     } 
     flag = true; 
     break; 
    } 
    if (flag) continue; 
} 

這:

foreach (var a in query) 
{ 
    foreach (var b in secQuery) 
    { 
     if (b > a) 
     { 
      count++; 
     } 
    //break; continue; 
    } 
} 
+0

顯示的代碼片段將比較第一個列表中的每個元素與第二個列表中的每個元素。可以嗎? –

+0

爲什麼不用一個'for'來迭代每個數組的最小長度?似乎你想要做的事情像'for(int i = 0; i secQuery [i])count ++;'現在您將'query'的每個元素與'secQuery'的每個其他元素進行比較,複雜度爲n²。精確定義你的問題。我不明白爲什麼你想在第一次迭代之後立即在內部的foreach循環中'break',然後再打破外部循環。 –

回答

3

你不需要比較並行陣列嵌套循環。需要一個單一的循環,同時迭代兩個陣列 - 例如,可以通過索引:

for (var i = 0 ; i != query.Length ; i++) { 
    var first = query[i]; 
    var second = secQuery[i]; 
    Console.WriteLine("Comparing {0} and {1}", first, second); 
} 

上述代碼假定兩個陣列具有相同數量的元素。

你也可以使用LINQ的Zip方法配對元素:

foreach (var p in query.Zip(secQuery, (first, second) => new {first, second}) { 
    Console.WriteLine("Comparing {0} and {1}", p.first, p.second);   
} 

如果你需要的是項目的query是比secQuery更大的計數,計算它是這樣的:

var res = query 
    .Zip(secQuery, (first, second) => first > second) 
    .Count(cmp => cmp); 
+0

我原本以爲拉鍊;在這種情況下,OP只是想要一個比較計數,我想不出使用zip返回比較計數的體面方式。如果你有一些想法,我會很感興趣。 –

+0

@MetroSmurf你可以將它們組合成一個'bool',並計算有多少個項目是'true'(見編輯)。 – dasblinkenlight

+0

有趣的方法來投影到布爾和計數反對真實的項目。做得好。 –

0

現在,您的代碼顯示瞭如何將第一個列表中的元素a與第二個列表中的每個元素b進行比較。

你說的你想要做的是實際上比較各自的元素。只需使用一個索引器。

if(query.Count() == secQuery.Count()) { 
    for(var i = 0; i<query.Count(); i++) { 
     var a = query[i]; //assuming you have an indexer on your types, otherwise maybe you can convert to List using ToList() linq method 
     var b = secQuery[i]; 
     if(b > a) count++; //now a and b are corresponding elements you can compare them 
    } 
} 
0

任務沒有明確的定義,所以基於合格的猜測,似乎你可以使用達到的效果在一個相當簡單的方式對環

for (int i = 0; i <= query.Length; i++) 
{ 
    if(query[i]<secQuery[i]) count++ 
} 

希望這可能有幫助。

1

到壓縮和解或環路中的標準方法是使用在Linq.Where提供訪問的元素的索引過載被評估和使用索引來比較其他列表的替代:

var q1 = new[] {0, 4, 1, 0, 0}; 

var q2 = new[] {1, 1, 0, 0, 3}; 

int count = q1.Where((x,i) => q2[i] > x).Count(); 

count的結果將爲2.