Recientemente, un compañero de trabajo me preguntó: ¿Es posible simplemente tomar los primeros cinco elementos y los últimos cinco elementos mediante una consulta de una matriz?
int[] someArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 };Lo que he probado:
int[] someArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; var firstFiveResults = someArray.Take(5); var lastFiveResults = someArray.Skip(someArray.Count() - 5).Take(5); var result = firstFiveResults; result = result.Concat(lastFiveResults);¿Es posible tomar solo los primeros cinco elementos y los últimos cinco elementos en una consulta?
Puede usar un método .Where con lambda que acepta el índice del elemento como su segundo parámetro:
int[] someArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; int[] newArray = someArray.Where((e, i) => i < 5 || i >= someArray.Length - 5).ToArray(); foreach (var item in newArray) { Console.WriteLine(item); }Producción:
0, 1, 2, 3, 4, 14, 15, 16, 17, 18Una solución con ArraySegment<> (requiere .NET 4.5 (2012) o posterior):
var result = new ArraySegment<int>(someArray, 0, 5) .Concat(new ArraySegment<int>(someArray, someArray.Length - 5, 5)); Y una solución con Enumerable.Range :
var result = Enumerable.Range(0, 5).Concat(Enumerable.Range(someArray.Length - 5, 5)) .Select(idx => someArray[idx]);Ambas soluciones evitan iterar a través del "medio" de la matriz (índices 5 a 13).
En caso de que no esté jugando a los rompecabezas de código con sus compañeros de trabajo, pero solo quiera crear una nueva matriz con sus criterios, no haría esto con consultas en absoluto, sino que usaría Array.copy.
Hay tres casos distintos a considerar:
El tercero es el caso simple, ya que el primero y el último 5 elementos son distintos y están bien definidos.
Los otros dos requieren más reflexión. Asumiré que desea lo siguiente, verifique esas suposiciones:
Si la matriz de origen tiene menos de 5 elementos, querrá tener una matriz de 2 * (longitud de la matriz), por ejemplo, [1, 2, 3] se convierte en [1, 2, 3, 1, 2, 3]
Si la matriz de origen tiene entre 5 y 9 elementos, querrá tener una matriz de exactamente 10 elementos, por ejemplo, [1, 2, 3, 4, 5, 6] se convierte en [1, 2, 3, 4, 5, 2, 3, 4, 5, 6]
Un programa de demostración es
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; }que corre en O(1);
Si está jugando rompecabezas de código con sus compañeros de trabajo, bueno, toda la diversión está en el rompecabezas, ¿no es así?
Aunque es trivial.
src.Take(5).Concat(src.Reverse().Take(5).Reverse()).ToArray();esto se ejecuta en O(n).