2

a100個の整数の配列があります。この最小値のインデックスをa[3]介して最小値を見つけるための推奨される方法は何ですか?値の重複がないと仮定します。a[70]

関連する範囲のインデックスをループする不器用な方法を知っています。

for(i = 3; i < 70, i++) 
{
    ...
}

ループするのではなく、C#でこれを行うためのよりエレガントな方法を探しています。ありがとう。

4

3 に答える 3

6

分を見つけるには

List<int> templist = a.Skip(3).Take(67).ToList();

int minimum = templist.Min();

インデックス用

int index = templist.FindIndex(i => i == minimum) + 3;

リストのインデックスは元のシーケンスのインデックスより3少ないため、3を追加しましたa

それがしていること

  1. スキップ-最初の3つの値、つまりインデックス0、1、2を残し、残りの配列を返します。
  2. Take-Skipによって返された配列から、67個の値を取ります。(forループは3から始まり70まで続くので、基本的に67個のアイテムでループしています。bcoz70-3 = 67)。
  3. ToList-インデックスを見つけるために、返されたシーケンスをリストに変換します。
  4. 最小-最小値を取得します。

ループなので、ループを使用する必要があります。あなたがエレガントだと言ったので、forループの代わりにLINQを使用しました(それでもそのループを実行します)。

于 2012-05-26T02:02:47.677 に答える
3

データ構造が並べ替えられていない場合、提供されたAPIを介して暗黙的なループを使用する場合でも、サブリスト内のすべての要素をループせずに並べ替える方法はありません。

サブパートで作業しているため、ソートされたコレクションを使用することはできません(したがって、リストの一部に対してソートされたコレクションを作成する必要があります)。したがって、いずれの場合も、それをループする必要があります。

于 2012-05-26T02:05:05.227 に答える
1

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ベースのタプルを作成し、匿名型の代わりにそれを使用すると、追加のメモリが割り当てられないため、より効率的な直接反復に匹敵します。

于 2012-05-26T02:45:42.787 に答える