2017-02-24 22 views
-4

は、そのような私が返すように1行(または数行など)でLINQを使うのですかLINQを使用して、リストのリスト内の最大数(C#の)

A[0] = {1,2,3,4} 

A[1] = {3,4,5,6} 

B[0] = {2,5,6,9} 

B[1] = {4,5,7,8} 

そのリストAとBの二つのリストを考えると、次の検索4つのリストA [0]、A [1]、B [0]およびB [1]のすべてにおいて値1の後で最大の数?複数行では、次のようにします:

int num1 = A[0].Find(item => item > 1); (answer is 2) 

int num2 = A[1].Find(item => item > 1); (answer is 3) 

int num3 = B[0].Find(item => item > 1); (answer is 2) 

int num4 = B[1].Find(item => item > 1); (answer is 4) 

int finalAnswer = Max(num1,num2,num3,num4); (final answer is 4) 

答えは、(4だけでなく)任意の数のリストに拡張可能です。ありがとう!

+0

より大きい値を意味しないでくださいしている場合ansnullであるかどうかを確認する必要があると思います't 1、または1より大きい最小のアイテムが必要ですか?だから{4,2,3,1}の場合は4か2が欲しいですか? – juharr

+0

@juharr:各リストから次の値が1以上であることを確認し、各リストのすべての値を比較し、最大値を選択します。私は上記の私の例では明らかだったことを願っています。 – dynomillie

+1

このサイトの名前を変更する必要がありますCheatonyourhomework.com – Trey

答えて

1

基本的には、配列の2つのコレクションを連結し、各配列に対して1以下のものをフィルタリングして結果を注文し、最初の項目を取ることができます。次に、それらの値の最大値を取る。

配列のいずれかが1よりも高い少なくとも一つの番号が含まれていない場合に例外をスローします
int ans A.Concat(B).Select(x => x.Where(i => i > 1).OrderBy(i => i).First()).Max(); 

。その場合は、代わりにFirstOrDefaultを使用します。

int? ans A.Concat(B).Select(x => x.Where(i => i > 1).OrderBy(i => i).FirstOrDefault()).Max(); 

しかし、その後、あなたはリストのどれもが、あなたがにISN各リストの最初の項目をしたい1.

if(!ans.HasValue) 
    throw new Exception("nothing over one"); 
int actualAnswer = ans.Value; 
+0

素晴らしい、これは動作します! 「Where」、「OrderBy」、「First」の代わりに「Find」を使うことができます。なぜなら、「Find」はリスト内で条件に一致する最初の数字を取得するからです。 – dynomillie

+0

A.Concat(B).Select(x => x.Find(i => i> 1))。Max()は私にとってはうまくいくようです。どうも! – dynomillie

+0

@dynomillie 'Find'は、リストが既にソートされている場合にのみ機能します。また、要件に一致する値がない場合は0を返します。したがって、リストに1以上の値がない場合は0をチェックする必要があります。最後に、要件を-1以上の数値に変更した場合は、 0の結果が実際の答えであるかどうかを知るか、-1以上の値がないことを意味するかどうかを知る。ありがとう。 – juharr

関連する問題