2017-05-30 103 views
0

uint类型的两个列表称为firstReadOfMachineTotalssecondReadOfMachineTotals如何比较两个提示列表并计算任意值的差异?

我完全新的C#编程。

我想比较两个列表,如果第二个列表中的任何值高于第一个列表,则计算多少。

例如...

firstReadOfMachineTotals = 10, 20, 4000, 554 
secondReadOfMachineTotals = 10, 40, 4000, 554 

我想回到“20”(基于第二项比相当于20多在第一个列表)。

谢谢

PS。第二个列表中永远不会有多个不同的数字。

+0

你有没有尝试什么吗?它可以使用LINQ FirstOrDefault + null-propagation在单行代码中完成,但对于你来说它将是**无用的**,因为你不会自己学习任何东西。您需要尝试使用简单的循环和ifs来自己完成 - 只需遍历索引并比较两个值即可。 –

+2

如果你在第二个列表中有另一个更高的数字?你将返回他们的总和是什么?或差异列表? –

+0

@OfirWinegarten好的问题,我应该指出,除非另一个代码有问题,那么应该永远不会有两个数字不同。我将编辑该问题。谢谢。 –

回答

1

您可以使用Zip组合,Where

var firstReadOfMachineTotals = new[]{ 10, 20, 4000, 554 }; 
var secondReadOfMachineTotals = new[]{ 10, 40, 4000, 554}; 

var result = firstReadOfMachineTotals.Zip(secondReadOfMachineTotals, (a,b) => b > a ? b - a : 0) 
         .Where(x => x > 0) 
         .OrderByDescending(x => x) 
         .FirstOrDefault(); 

Console.WriteLine(result); // output = 20 

此方法将默认为0当所有值都相同。相反,如果你想要这个默认的控制,你也可以这样做:

var firstReadOfMachineTotals = new[]{ 10, 20, 4000, 554 };  
var secondReadOfMachineTotals = new[]{ 10, 40, 4000, 554}; 


var result = firstReadOfMachineTotals.Zip(secondReadOfMachineTotals, (a,b) => b > a ? b - a : 0) 

         .Where(x => x>0) 
         .DefaultIfEmpty(int.MinValue) // or whatever default you desire 
         .Max(); 

Console.WriteLine(result); // output = 20 
0

使用Zip

var result = firstReadOfMachineTotals.Zip(secondReadOfMachineTotals, 
       (f, s) => s > f ? s - f : 0).Where(f => f > 0).DefaultIfEmpty(-1).Max(); 
+1

@ S.Akbari好吧,你从我这里得到了赞赏。感谢您的解决方案,我会在下班回家时试试这个方案。现在阅读“Zip”,试着了解您的解决方案将如何工作。欢呼声:-) –

-1

最简单的解决方法是将排序两个阵列

array1.sort() 
array2.sort() 

,并比较各指标,并采取行动

for(int i=0;i<array1.lenght;i++) 
    { 
    if(array1[i] < array2[i]) 
    { 
    // Specify your action. 
    } 
} 
+1

您是否将此错误误认为javascript问题? – Jamiec

1

你可以索引到列表并简单地获取指定索引处每个元素的差异,然后求和区别来检索结果。

int result = Enumerable.Range(0, Math.Min(list1.Count, list2.Count)) 
         .Select(i => list2[i] - list1[i] <= 0 ? 0 : list2[i] - list1[i]).Sum(); 
+1

感谢您的回答。 :-) –

-1

另一种方式来做到这一点是:

int difference = arr1 
    .Zip(arr2, (a, b) => (int?)Math.Max(b - a, 0)) 
    .SingleOrDefault(d => d != 0) ?? 0; 

,如果有第二个集合中的元素返回区别哪些比第一集合中的相应元素大。
如果没有,则返回零。

信息阅读:

LINQ Zip
LINQ FirstOrDefault
?? Operator
Nullable Types (int?)

+1

int从不为空,所以你不能使用'??' –

+0

这看起来不错。下班回家时我会试试看。非常感谢LINQ信息的链接。我会阅读和消化。欢呼声:-) –

+0

@TimSchmelter当然,你是对的。我更新了我的解决方案,并将其转换为'int?',而且看起来不再优雅。无论如何,它解决了这个问题,可能对OP有用:) –

相关问题