Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

118
Views
Tome los primeros cinco elementos y los últimos cinco elementos de una matriz mediante una consulta usando LINQ

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?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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, 18
over 4 years ago · Santiago Trujillo Report

0

Una 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).

over 4 years ago · Santiago Trujillo Report

0

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:

  • la matriz de origen tiene menos de 5 elementos
  • la matriz de origen tiene de 5 a 9 elementos
  • la matriz de origen tiene 10 o más elementos

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).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!