0

リスト:

List<int> list1 = new List<int>(){ 0, 1, 2, 3, 4, 5, 6 };

再注文したいとしましょう。先頭は「2」の番号である必要があります

// 2,3,4,5,6,0,1

または番号5で

// 5,6,0,1,2,3,4

C#でどのようにそれを行いますか?

理由:リストに特定の番号のインデックス(番号3、インデックス3)があるとします。右から2番目の数字を取得したい-それは5になります。

残念ながら、開始番号がリストの最後(番号5と6)にある場合、7と8がないため、範囲外の例外がスローされます。

アイデアはリストを並べ替えることです!

  • Nrに入ります。5-私たちは0(5,6,0)を取得します。
  • Nrに入ります。6-1(6,0,1)などを取得します。

または、この問題を解決する他の(読む-より良い)方法があるのでしょうか?

4

3 に答える 3

4

これを行うためのより良い方法は、mod演算子%を使用することです。これにより、intを別のintで除算したときに余りが得られます。これが機能する方法は次のようなものです。

int nextIndex = (currentIndex + offset) % length;

したがって、現在のインデックスが5で、オフセットが2で、長さが6の場合、次のようになります。

5 + 2 = 7
7 / 6 = 1 remainder 1 (or 7 mod 6 = 1)
therefore nextIndex = 1
于 2012-04-10T15:47:38.690 に答える
3

小さなLinqはこれを非常に簡単に行うことができます:

List<int> list1 = new List<int>(new[] { 0, 1, 2, 3, 4, 5, 6 });

var numToStart = 4;

//reorderedList will be {4,5,6,0,1,2,3}
var reorderedList = list1.Skip(numToStart).Concat(list1.Take(numToStart));
于 2012-04-10T15:47:46.430 に答える
2

リストを並べ替える必要はありません。次の関数で番号を取得できます。

int GetNumber(List<int> list, int fromValue, int index) 
{
    return list[(list.IndexOf(fromValue) + index) % list.Count()];
}

次のような関数を呼び出すことができます。

List<int> list1 = new List<int>(new[] { 0, 1, 2, 3, 4, 5, 6 });
int number = GetNumber(list1, 5, 2); // number = 0
于 2012-04-10T15:48:44.217 に答える