2016-03-26 28 views
0

sorgusu: 0 4 1 0 0foreach

secQuery: 1 1 0 0 3

I elemanları karşılaştırmak gerekir

: 0 ve 1, 4 ve 1, 1 ve 0, 0 ve 0 0 ve 3. Fakat mola, ikinci foreach'ımı durdurur.

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

Ve bu:

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

Gösterilen kod pasajı, birinci listedeki her öğeyi ikinci öğedeki tüm öğelerle karşılaştırır. Tamam mı? –

+0

Neden her dizinin en az uzunluğu boyunca yinelemek için bir '' kullanmayın? (Int i = 0; i secQuery [i]) sayın ++; "Sorgu" öğesinin her öğesini "secQuery" öğesinin diğer öğeleriyle karşılaştırıyorsunuz, karmaşıklık n². Öncelikle sorununuzu öncelikle tanımlayın. İlk iterasyondan sonra niçin iç “foreach” döngüsünde “kırmak” ve sonra da dışını kırmak istediğinizi anlamıyorum. –

cevap

3

Paralel diziler karşılaştırmak için iç içe geçmiş bir döngü gerekmez

Bunu deneyin. Aynı anda her iki diziler dolaşır tek bir döngü gerek - örneğin, kendi dizine göre:

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

Yukarıdaki kod hem diziler öğe aynı sayıda olduğunu varsayar. İhtiyacınız olan tüm secQuery üstündeyse query öğelerin sayısı ise bunu böyle hesaplamak,

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

:

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

Orijinal olarak zip'i düşünmüştüm; Bu durumda, OP sadece bir karşılaştırma sayısı istiyor ve karşılaştırma sayısını döndürmek için zip kullanmanın iyi bir yolunu düşünemedim. Bazı fikirlerin olsaydı ilgilenirdim. –

+0

@MetroSmurf Bunları bir "bool" haline getirebilir ve kaç öğenin "true" olduğunu ölçebilirsiniz (düzenlemeye bakın). – dasblinkenlight

+0

Bir boole dönüştürmek ve gerçek öğelere karşı saymak için ilginç bir yaklaşım. Aferin. –

0

Ayrıca LINQ en Zip yöntemi kullanılarak unsurları eþleþtirebilirsiniz

Şimdi kodunuz, ikinci listenin her elemanı b ile ilk listeden a bir öğenin nasıl karşılaştırılacağını gösterir.

Yapmak istediğiniz şey aslında birbiriyle ilgili öğeleri karşılaştırmaktır. Sadece bir dizinleyici kullanın.

görev açıkça tanımlanmamıştır
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

, böylece nitelikli tahminine dayanarak, kullanarak oldukça basit bir yolla sonucu elde edebilirsiniz görünüyor For döngüsü:

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

Umut bu yardımcı olabilir.

1

sıkıştırma veya döngü için standart başka listeye karşılaştırma değerlendirilmektedir elemanının indeksine erişim sağlar Linq.Where içinde aşırı kullanmak ve dizin kullanmaktır bir alternatif:

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(); 

The count sonucu 2 olacaktır.