假设我有一个整数序列,从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;
}
答案 0 :(得分:9)
public static IEnumerable<int> Foo(int count, int start, int max)
{
return Enumerable.Range(0, count)
.Select(n => (n + start) % (max + 1));
}
答案 1 :(得分: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();
}
答案 2 :(得分:3)
使用LINQ:
public static IEnumerable<int> Foo(int length, int start, int end)
{
return Enumerable.Range(start, length).Select(n => n % (end + 1));
}
答案 3 :(得分: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);
}
答案 4 :(得分: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;
}