1 から 6 までの 0.01 ずつ増加する配列を生成したい場合、これを行う最も効率的な方法は何ですか?
私が欲しいのは、最小値と最大値が後で変更される可能性のある配列です...次のように:x[1,1.01,1.02,1.03...]
1 から 6 までの 0.01 ずつ増加する配列を生成したい場合、これを行う最も効率的な方法は何ですか?
私が欲しいのは、最小値と最大値が後で変更される可能性のある配列です...次のように:x[1,1.01,1.02,1.03...]
と値を仮定すると、これstart
をさらに抽象化できます。end
increment
Enumerable
.Repeat(start, (int)((end - start) / increment) + 1)
.Select((tr, ti) => tr + (increment * ti))
.ToList()
それを分解しましょう:
Enumerable.Repeat
開始番号を取り、指定された数の要素を繰り返し、列挙型 (コレクション) を返します。この場合、start
要素から始めて、 と の差を見つけてstart
でend
割って(これにより、とincrement
の間の増分数が得られます)、元の数を含めるために 1 を追加します。これにより、使用する要素の数がわかります。は decimal/double であるため、int にキャストすると丸めエラーが発生する可能性があることに注意してください。start
end
increment
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 よりも前でなければならないためです。
最も簡単な方法は、次を使用することEnumerable.Range
です。
double[] result = Enumerable.Range(100, 500)
.Select(i => (double)i/100)
.ToArray();
(したがって、読みやすさとコード行の点で効率的です)
私は単純な関数を作るだけです。
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();
0.01 刻みの for ループを使用します。
List<decimal> myList = new List<decimal>();
for (decimal i = 1; i <= 6; i+=0.01)
{
myList.Add(i);
}
エレガント
double[] v = Enumerable.Range(1, 600).Select(x => x * 0.01).ToArray();
効率的
Use for loop
何をするにしても、浮動小数点データ型 ( などdouble
) を使用しないでください。丸め動作に代わって、このようなものには機能しません。decimal
、または因数付きの整数のいずれかを選択します。後者の場合:
Decimal[] decs = new Decimal[500];
for (int i = 0; i < 500; i++){
decs[i] = (new Decimal(i) / 100)+1 ;
}
こんな感じで解けます。ソリューション メソッドは 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;
}
var ia = new float[500]; //guesstimate
var x = 0;
for(float i =1; i <6.01; i+= 0.01){
ia[x] = i;
x++;
}
速度を上げるためにこれをマルチスレッド化することもできますが、非常に遅いプロセッサでこれを実行する予定がない限り、おそらくオーバーヘッドの価値はありません。