2016-03-26 161 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.