如果你不是与同事一起玩代码谜题,而只想按照自己的标准创建一个新数组,我不会使用查询来做这件事,而是使用Array.copy。
需要考虑三种不同的情况:
- 源数组少于5个项目
- 源数组有5到9个项目
- 源数组具有10个或更多项目
第三种情况是简单的情况,因为前五个和后五个元素是明确且定义良好的。
其他两种情况需要更多的思考。我将假设您想要以下内容,请检查这些假设:
如果源数组少于5个项目,则希望有2 *(数组长度)项的数组,例如[1, 2, 3]变成[1, 2, 3, 1, 2, 3]
如果源数组有5到9个项目,则希望有恰好10个项目的数组,例如[1, 2, 3, 4, 5, 6]变成[1, 2, 3, 4, 5, 2, 3, 4, 5, 6]
演示程序如下:
public static void Main()
{
Console.WriteLine(String.Join(", ", headandtail(new int[]{1, 2, 3})));
Console.WriteLine(String.Join(", ", headandtail(new int[]{1, 2, 3, 4, 5, 6})));
Console.WriteLine(String.Join(", ", headandtail(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11})));
}
private static T[] headandtail<T>(T[] src) {
int runlen = Math.Min(src.Length, 5);
T[] result = new T[2 * runlen];
Array.Copy(src, 0, result, 0, runlen);
Array.Copy(src, src.Length - runlen, result, result.Length - runlen, runlen);
return result;
}
这个算法的时间复杂度为 O(1)。
如果你和同事一起玩代码谜题,那么乐趣就在于解谜了,不是吗?
虽然这很琐碎。
src.Take(5).Concat(src.Reverse().Take(5).Reverse()).ToArray();
这个程序的时间复杂度为O(n)。
someArray.Take(5).Concat(someArray.Reverse().Take(5));
这个怎么样? - Nileshint[]
或T[]
(如果是泛型),但也可以根据常用于集合类的几个接口之一来定义。例如,大多数 linq 都是在非常通用的IEnumerable<T>
上定义的。您还可以将其定义为IReadOnlyList<T>
、IList<T>
、ICollection<T>
... 您选择的“类型”决定了某人可以传递给该方法的有效集合,它还限制了实现可以使用的技术。 - Drew Noakes