2017-05-30 9 views
0

は、私はC#プログラミングを完全に新たなんだfirstReadOfMachineTotalssecondReadOfMachineTotalsuintの2つのリストを比較してどのような値の差を計算するにはどうすればよいですか?

と呼ばuintタイプの2つのリストを持っています。

両方のリストを比較したいと思います。第2リストの値のいずれかが最初のリストよりも高い場合は、どれだけ計算しますか。例えば

...

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

私は(2番目の項目は、最初のリストの等価よりも20以上であることに基づいて)「20」を返すようにしたいです。

ありがとう

PS。 2つ目のリストには1つ以上の番号がありません。

+0

あなたは何を試してみましたか?LINQ FirstOrDefault + null-propagationを使用して1行のコードで美しく行うことができますが、何も学習しないので**無駄です**。単純なループやifを使って自分でやろうとする必要があります。インデックスを繰り返して2つの値を比較するだけです。 –

+2

2番目のリストにもう1つ高い数字がある場合は?あなたは何を合計して返しますか?または違いのリスト? –

+0

@OfirWinegarten良い質問ですが、他のコードに問題がなければ、2つの数字が決して異なってはいけないという点を指摘しておきました。私は質問を編集します。ありがとう。 –

答えて

1

あなたはZipWhereの組み合わせを使用することができます。

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あなたは私からupvoteを持っています。ソリューションをありがとう、私は仕事から家に帰るときにこれを試してみます。あなたのソリューションがどのように機能するかを理解して理解するために、今すぐ「Zip」について読むことが必要です。乾杯:-) –

-1

最も簡単な解決策は、あなたがへのインデックスをすることができます配列

array1.sort() 
array2.sort() 

の両方をソートし、各指標を比較することで、アクション

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

これはジャバスクリプトの質問に間違えましたか? – 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; 

は、それが違いを返します第1のコレクションからの対応する要素よりも大きい。
存在しない場合は0を返します。読んで

情報:

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

+1

intはnullではないので、 '?? 'を使うことはできません –

+0

これはすばらしく見えます。私は仕事から家に帰るときにそれを行かせます。そして、LINQ情報へのリンクには大変感謝しています。私は読むと消化します。乾杯:-) –

+0

@TimSchmelterもちろん、あなたは正しいです。私は 'int? 'へのキャストで私のソリューションを更新しましたが、それはもはやエレガントに見えません。とにかく、それは問題を解決し、OPのために有用かもしれません:) –

関連する問題