2016-03-26 5 views
0

запроса: 0 4 1 0 0Еогеасп в Еогеасп 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 после первой итерации, а затем также нарушить внешний. –

ответ

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

Приведенный выше код предполагает, что оба массива имеют одинаковое число элементов.

Вы также можете соединить элементы, используя Zip метод LINQ в:

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

Я изначально думал о zip; в этом случае OP просто хочет подсчета сравнений, и я не мог придумать достойный способ использования zip, чтобы вернуть счет сравнения. Мне было бы интересно, если бы у вас были идеи. –

+0

@MetroSmurf Вы можете объединить их в 'bool' и подсчитать количество элементов' true' (см. Edit). – dasblinkenlight

+0

Интересный подход к проекту в bool и подсчет против истинных предметов. Отлично сработано. –

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.

Смежные вопросы