序列数组

3
假设我有一系列整数,从0开始(始终从0开始)到3。现在,我有一个整数数组,它将包含那些序列循环后的结果,从某个点开始。例如:
一个包含10个元素的数组,序列是0到3,从2开始,应该产生2、3、0、1、2、3、0、1、2、3。
一个包含5个元素的数组,序列是0到5,从5开始,应该产生5、0、1、2、3。
一个包含5个元素的数组,序列是0到10,从3开始,应该产生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
你能发布一些代码吗?请解释一下你尝试过什么以及你目前卡住的地方。就目前而言,这篇文章似乎暗示你想让我们替你编写代码。 - Oded
你到目前为止尝试过_任何_东西了吗? - Soner Gönül
回应“你尝试过什么?”这一路线——这个问题太像“替我写了它”了。 - JerKimball
5个回答

9
public static IEnumerable<int> Foo(int count, int start, int max)
{
    return Enumerable.Range(0, count)
        .Select(n => (n + start) % (max + 1));
}

+1 聪明,非常好。我花了半分钟才理解它的工作原理 :) - Sergey Berezovskiy
+1和我类似,但你可以简化它,从开始开始。 - vlad
2
@vlad 是的,我想你可以这样做。不过,这似乎不值得花费太多时间去完成。 - Servy

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();
}

太棒了,我从未想过这个! - BlackBear
你可以直接重复 int.MaxValue,因为 Take 确保你永远不会到达末尾。 - Servy

3

使用LINQ:

public static IEnumerable<int> Foo(int length, int start, int end)
{
    return Enumerable.Range(start, length).Select(n => n % (end + 1));
}

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);
    }

你可以写“你可以使用Linq”。 - Sergey Berezovskiy
对于一个不那么LINQ的解决方案,它仍然有很多LINQ...(并不是说这是坏事,只是这样说)。 - Servy

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();

如果您知道数组大小、序列中的最大数字和起始值,那么创建这个数组的最佳方法是什么?
我看到有三个列出的输入,而不是之前考虑的四个。以下是如何使用您的方法完成它。
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; 
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接