2017-05-30 88 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有用:) –

相關問題