a
100個の整数の配列があります。この最小値のインデックスをa[3]
介して最小値を見つけるための推奨される方法は何ですか?値の重複がないと仮定します。a[70]
関連する範囲のインデックスをループする不器用な方法を知っています。
for(i = 3; i < 70, i++)
{
...
}
ループするのではなく、C#でこれを行うためのよりエレガントな方法を探しています。ありがとう。
分を見つけるには
List<int> templist = a.Skip(3).Take(67).ToList();
int minimum = templist.Min();
インデックス用
int index = templist.FindIndex(i => i == minimum) + 3;
リストのインデックスは元のシーケンスのインデックスより3少ないため、3を追加しましたa
。
それがしていること
ループなので、ループを使用する必要があります。あなたがエレガントだと言ったので、forループの代わりにLINQを使用しました(それでもそのループを実行します)。
データ構造が並べ替えられていない場合、提供されたAPIを介して暗黙的なループを使用する場合でも、サブリスト内のすべての要素をループせずに並べ替える方法はありません。
サブパートで作業しているため、ソートされたコレクションを使用することはできません(したがって、リストの一部に対してソートされたコレクションを作成する必要があります)。したがって、いずれの場合も、それをループする必要があります。
LINQAggregate
は最も簡単ではありませんが、おそらく「エレガントな」ソリューションの中で最も非効率的です(ただし、単純なループよりもコードの行数が多くなります。さらに、追加のソリューションを割り当てないため、自分自身を反復処理するのが最善です。メモリー)。
しかし、とにかく、後継者にあなたを肖像に吊るす必要があると感じた場合は、単純なループの代わりにこれを行うことができます:
var minValueAndItsIndex = a
.Skip(3)
.Take(70 - 3)
.Select((value, index) => new { Value = value, Index = index + 3})
.Aggregate((tuple1, tuple2) => (tuple1.Value < tuple2.Value) ? tuple1 : tuple2);
2項目ValueType
ベースのタプルを作成し、匿名型の代わりにそれを使用すると、追加のメモリが割り当てられないため、より効率的な直接反復に匹敵します。