7

1 から 6 までの 0.01 ずつ増加する配列を生成したい場合、これを行う最も効率的な方法は何ですか?

私が欲しいのは、最小値と最大値が後で変更される可能性のある配列です...次のように:x[1,1.01,1.02,1.03...]

4

8 に答える 8

16

と値を仮定すると、これstartをさらに抽象化できます。endincrement

Enumerable
    .Repeat(start, (int)((end - start) / increment) + 1)
    .Select((tr, ti) => tr + (increment * ti))
    .ToList()

それを分解しましょう:

Enumerable.Repeat開始番号を取り、指定された数の要素を繰り返し、列挙型 (コレクション) を返します。この場合、start要素から始めて、 と の差を見つけてstartend割って(これにより、とincrementの間の増分数が得られます)、元の数を含めるために 1 を追加します。これにより、使用する要素の数がわかります。は decimal/double であるため、int にキャストすると丸めエラーが発生する可能性があることに注意してください。startendincrement

Select特定のセレクター関数を指定して、列挙可能な要素のすべての要素を変換します。この場合、生成された数値とインデックスを取得し、元の数値に増分を乗じたインデックスを追加します。

最後に、 を呼び出すとToList、コレクションがメモリに保存されます。

これを頻繁に使用している場合は、これを行うためのメソッドを作成できます。

public static List<decimal> RangeIncrement(decimal start, decimal end, decimal increment)
{
    return Enumerable
        .Repeat(start, (int)((end - start) / increment) + 1)
        .Select((tr, ti) => tr + (increment * ti))
        .ToList()
}

編集: 非整数値が維持されるように、繰り返しを使用するように変更されました。incrementまた、ここではエラー チェックが行われていないため、が 0 ではなく、start< ) であることを確認する必要がありend * sign(incrementます。end にインクリメントの符号を掛ける理由は、負の数でインクリメントする場合、end が start よりも前でなければならないためです。

于 2012-05-23T13:51:20.983 に答える
11

最も簡単な方法は、次を使用することEnumerable.Rangeです。

double[] result = Enumerable.Range(100, 500)
                  .Select(i => (double)i/100)
                  .ToArray();

(したがって、読みやすさとコード行の点で効率的です)

于 2012-05-23T13:50:38.043 に答える
5

私は単純な関数を作るだけです。

    public IEnumerable<decimal> GetValues(decimal start, decimal end, decimal increment)
    {
        for (decimal i = start; i <= end; i += increment)
            yield return i;
    }

次に、それを配列に変換したり、クエリを実行したり、必要なことをしたりできます。

        decimal[] result1 = GetValues(1.0m, 6.0m, .01m).ToArray();
        List<decimal> result2 = GetValues(1.0m, 6.0m, .01m).ToList();
        List<decimal> result3 = GetValues(1.0m, 6.0m, .01m).Where(d => d > 3 && d < 4).ToList();
于 2012-05-23T14:07:14.557 に答える
2

0.01 刻みの for ループを使用します。

List<decimal> myList = new List<decimal>();

for (decimal i = 1; i <= 6; i+=0.01)
{
  myList.Add(i);
}
于 2012-05-23T13:50:49.597 に答える
1

エレガント

double[] v = Enumerable.Range(1, 600).Select(x => x * 0.01).ToArray();

効率的

Use for loop
于 2012-05-23T13:51:27.077 に答える
0

何をするにしても、浮動小数点データ型 ( などdouble) を使用しないでください。丸め動作に代わって、このようなものには機能しません。decimal、または因数付きの整数のいずれかを選択します。後者の場合:

Decimal[] decs = new Decimal[500];
for (int i = 0; i < 500; i++){
  decs[i] = (new Decimal(i) / 100)+1 ;
}
于 2012-05-23T13:48:56.703 に答える
0

こんな感じで解けます。ソリューション メソッドは double 配列を返します

double[] Solution(double min, int length, double increment)
{
    double[] arr = new double[length];
    double value = min;
    arr[0] = value;
    for (int i = 1; i<length; i++)
    {
        value += increment;
        arr[i] = value;
    }
    return arr;
}
于 2016-06-28T09:53:06.017 に答える
-1
var ia = new float[500]; //guesstimate
var x = 0;
for(float i =1; i <6.01; i+= 0.01){
    ia[x] = i;
    x++;
}

速度を上げるためにこれをマルチスレッド化することもできますが、非常に遅いプロセッサでこれを実行する予定がない限り、おそらくオーバーヘッドの価値はありません。

于 2012-05-23T13:50:46.330 に答える