2016-07-27 18 views
-3

リストを調べ、最大値と最小値を見つける必要があります。このリストは、ユーザーがフォームテキストボックスに情報を入力したときの入力に基づいて作成されます。そして、私のフォームで計算するためにボタンをクリックするたびに、計算を行い、小数点をlistProfitに挿入するコードを実行します。 場所全体を見渡して.Sort()を使用してみましたが、システムエラーが発生します。C#リストから最小値と最大値を取得

これはエラーです。

「のSystem.InvalidOperationException」 タイプの未処理の例外がmscorlib.dllで発生しました。追加情報:コレクションが が変更されました。列挙操作が実行されないことがあります。

エラーが私のforeachループで "中" を強調しています。 System.Linqのから

//list of each order total 
List<decimal> listProfit = new List<decimal>(); 

    foreach(int item in listProfit) 
        { 
         listProfit.Sort(); 
         decimal smallest = listProfit[0]; 
         decimal largest = listProfit[listProfit.Count - 1]; 
         SmallTxt.Text = smallest.ToString("c"); 
         LargestTxt.Text = largest.ToString("c"); 
        } 
+5

なぜ繰り返しごとにコレクションをソートしていますか?それは私にとっては非常に悪い考えです。ソート後、なぜあなたは何度も繰り返しますか?完全なスタックトレースとは何ですか? [mcve] –

+3

.Min()、.Max()を表示してください。 –

+0

計算を実行するたびに新しい値が入力されるため、毎回リストをソートします。 –

答えて

5

使用MinMax

var min = listProfit.Min(); 
var max = listProfit.Max(); 
+0

あなたが提案したことをやると、私はエラーを受け取ります。 「System.InvalidOperationException」種類の未処理の例外は、System.Core.dllに 発生しました追加情報:シーケンスに要素が含まれていない –

+1

@CodyMoser:まあ、あなたのコードによると、あなたは空のリストを持っています。 *最小値または最大値はありません。値がまったくないからです。 – David

4

あなたがすべてで反復する必要はありません。リストのソートを続行したい場合は、以下のように言うことができます。そうでなければ、それらの直接

listProfit.Sort(); 
    decimal smallest = listProfit[0]; 
    decimal largest = listProfit[listProfit.Count - 1]; 
2

が最大

LargestTxt.Text = listProfit.Max().ToString("c"); 

にソートする必要性を全く取得しないために

SmallTxt.text = listProfit.Min().ToString("c"); 

最小値の使用を得るために取得するためにMin()Max() LINQの拡張メソッドを使用してみてくださいただし、これらの操作の両方がリスト全体を列挙することに注意してください。

0

あなたの質問に基づいて、私はあなたが初心者で想定しています。 KISSを検討し、LINQなしでこれを行う方法を考えてください。

// declare list 
var listProfit = new List<decimal>(); 
// populate list 
listProfit.Add(300.5m); //etc 

// initial values for min and max 
decimal min = Decimal.MaxValue; 
decimal max = Decimal.MinValue; 

// loop through the list 
for (int i = 0; i < listProfit.Count; i++) 
{ 
    // is the current item smaller than min? 
    if (listProfit[i] < min) 
     // if yes, set min to that value 
     min = listProfit[i]; 
    // is the current value greater than max? 
    if (listProfit[i] > max) 
     // if yes, set max to that value 
     max = listProfit[i]; 
} 

// you are now outside of the for loop, with your min and max values populated 

リストをあらかじめ並べ替える場合は、@ Rahulの回答が必要です。

関連する問題