3

0 (常に 0 から始まる) から 3 までの整数のシーケンスがあるとします。これで、整数の配列ができました。これは、特定のポイントから開始して、次々にループされたシーケンスを保持します。例えば:

10 個の要素の配列で、シーケンスは 0 から 3 で、2 から始まり、2、3、0、1、2、3、0、1、2、3 になります。

0 から 5 までのシーケンスで 5 から始まる 5 つの要素の配列は、5、0、1、2、3 を生成する必要があります。

0 から 10 までのシーケンスで 3 から始まる 5 つの要素の配列は、3、4、5、6、7 を生成する必要があります。

私は脳の凍結に苦しんでいます!配列のサイズ、シーケンスの最大数、および開始値がわかっている場合、この配列を作成する最良の方法は何ですか?


私の最善の試みは次のとおりです。

private static int[] CreateIndexers(int index, int size, int players) 
{
  var indexers = new int[size];
  for (int i = 0; i < size; i++)
  { 
    var division = i / players; 
    var newInt = division + i >= players ? ((division + i) - players) : division + i;
    indexers[i] = newInt; 
  } 

  return indexers; 
} 
4

5 に答える 5

9
public static IEnumerable<int> Foo(int count, int start, int max)
{
    return Enumerable.Range(0, count)
        .Select(n => (n + start) % (max + 1));
}
于 2013-02-21T21:20:43.070 に答える
6
public int[] Cycle(int max, int start, int count)
{
    int cycles = count / max + 1;
    return Enumerable.Repeat(Enumerable.Range(0, max+1), cycles)
        .SelectMany(seq => seq)
        .Skip(start)
        .Take(count)
        .ToArray();
}
于 2013-02-21T21:19:02.970 に答える
3

LINQ を使用します。

public static IEnumerable<int> Foo(int length, int start, int end)
{
    return Enumerable.Range(start, length).Select(n => n % (end + 1));
}
于 2013-02-21T21:26:56.903 に答える
0

ソリューションの「LINQy」を減らしたバージョンを次に示します。

    public static IEnumerable<int> GetSequence(int start, int end, int count)
    {
        var fullSequence = new List<int>();
        var baseRange = Enumerable.Range(0, end + 1);
        fullSequence.AddRange(baseRange.Skip(start));

        while (fullSequence.Count < count)
        {
            fullSequence.AddRange(baseRange);
        }

        return fullSequence.Take(count);
    }
于 2013-02-21T21:15:54.940 に答える
0
int numberOfElements = 10;
int sequenceStartElement = 0;
int sequenceCount = 4;
int firstElement = 2;

IEnumerable<int> sequence = Enumerable.Range(sequenceStartElement, sequenceCount)
int[] array = sequence
     //you could figure out a lesser number to Repeat... but it's deferred, doesn't matter.
  .Repeat(numberOfElements) 
  .SkipWhile(x => x != firstElement)
  .Take(numberOfElements)
  .ToArray();

配列のサイズ、シーケンスの最大数、および開始値がわかっている場合、この配列を作成する最良の方法は何ですか?

以前に検討した 4 つではなく、3 つの入力がリストされていることがわかります。これがあなたのアプローチでそれを行う方法です。

private static int[] CreateIndexers(int firstElement, int numberOfElements, int sequenceMax) 
{
  int sequenceCount = sequenceMax + 1
  var indexers = new int[numberOfElements];
  for (int i = 0; i < numberOfElements; i++)
  { 
    indexers[i] = (i + firstElement) % sequenceCount;
  } 
  return indexers; 
} 
于 2013-02-21T21:22:37.423 に答える