0

ループでリストを使用するのに問題があります。誰かが私を助けてくれれば幸いです。リストを作成し、配列(私のコードではsarrayという名前)から-999より大きい値を入力したいと思います。ただし、問題は、値が-999未満の場合、コードがリストの前の項目をダンプし、サイズが40ではなく27(新しいリストリストが作成されたかのように)になることです。

  List<double> nums = new List<double>();
        for (int i = 0; i < 50; i++)
        {
            if (sarray[i] > -999)
            {
                nums.Add(sarray[i]);

            }
        }

これらは値です:

[31411.0857 31411.0902 31411.0847 31411.0858 31411.0859 31411.0479 31411.0649 31411.0895 31411.0944 31411.0207 31411.0683 31411.0717 31411.075 31411.0825 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 31411.0156 31411.0718 31411.0719 31411.0884 31411.0719 31411.0884 3 31411.0716 31411.0776 31411.0803 31411.091 31411.0911 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919]

4

4 に答える 4

6

あなたが説明することは、あなたが示したコードでは起こりません。-999より大きいインデックス0からインデックス49までの配列内のすべての値をリストに追加します。

配列が50アイテムより大きい場合、配列内のすべてのアイテムを使用するわけではありません。すべてのアイテムを取得するには、ループ内の配列の長さを使用する必要があります。

for (int i = 0; i < sarray.Length; i++)

(配列が常に50アイテムであることがわかっている場合でも、Lengthプロパティを使用することをお勧めします。そうすれば、将来配列の長さを変更しても、配列は常に配列全体を使用します。)

編集:

私はあなたのデータであなたのコードをテストしました、そしてリストは40項目で終わります。

double[] sarray = {
  31411.0857, 31411.0902, 31411.0847, 31411.0858, 31411.0859, 31411.0479,
  31411.0649, 31411.0895, 31411.0944, 31411.0207, 31411.0683, 31411.0717,
  31411.075, 31411.0825, -999, -999, -999, -999, -999, -999, -999, -999,
  -999, -999, 31411.0156, 31411.0718, 31411.0719, 31411.0884, 31411.0885,
  31411.0936, 31411.0896, 31411.0897, 31411.0537, 31411.066, 31411.0661,
  31411.0556, 31411.0701, 31411.0731, 31411.0952, 31411.0716, 31411.0776,
  31411.0803, 31411.091, 31411.0911, 31411.0919, 31411.0919, 31411.0919,
  31411.0919, 31411.0919, 31411.0919
};

List<double> nums = new List<double>();
for (int i = 0; i < 50; i++) {
  if (sarray[i] > -999) {
    nums.Add(sarray[i]);
  }
}

Console.WriteLine(nums.Count);

出力:

40
于 2012-06-12T15:07:14.070 に答える
4

ジェネリックリストは、オーバーロードされたコンストラクターの1つで列挙可能を取り、LinqWhere拡張メソッドを使用して、追加する項目を制約できます。

var nums = new List<double>(sarray.Where(d => d > -999));

「null」値を-999表すと述べた場合Where、有効な値が-999より大きいと想定しないようにを変更できます。

var nums = new List<double>(sarray.Where(d => d != -999));

このスタイルは、独自のループを作成するよりも明確に意図を表現していると思います。

余談double.NaNですが、無効な値のより明白な表現かもしれません。


ただし、問題は、値が-999未満の場合です。

これは、値が-999より大きい場所のみをチェックしているためです。if (sarray[i] > -999)

ただし、提供した値ダンプには-999未満の項目がないため、データセットが同じである限り、このチェックで十分です。

于 2012-06-12T15:02:44.507 に答える
1

このようなものは、自分自身を繰り返す必要なしに機能します。

List<double> nums = (from value in sarray 
                     where (value > -999) select value).ToList<double>();
于 2012-06-12T15:05:54.053 に答える
1

これを使って:

List<double> nums = new List<double>(sarray.Where(x => x > -999));
于 2012-06-12T15:04:42.680 に答える