tipos - ¿Cómo obtener los primeros N elementos de una lista en C#?
listas estructura de datos c++ (4)
Al igual que la pagination
, puede usar la siguiente fórmula para tomar slice of list or elements
:
var slice = myList.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
Ejemplo 1: primeros cinco artículos
var pageNumber = 1;
var pageSize = 5;
Ejemplo 2: segundos cinco elementos
var pageNumber = 2;
var pageSize = 5;
Ejemplo 3: terceros cinco elementos
var pageNumber = 3;
var pageSize = 5;
Si la notificación a los parámetros de fórmula
pageSize = 5
ypageNumber
está cambiando, si desea cambiar la cantidad de elementos en la división, cambie elpageSize
.
Me gustaría usar Linq para consultar un horario de autobús en mi proyecto, para que en cualquier momento pueda obtener los próximos 5 horarios de llegada de autobuses. ¿Cómo puedo limitar mi consulta a los primeros 5 resultados?
De manera más general, ¿cómo puedo tomar una porción de una lista en C #? (En Python usaría mylist[:5]
para obtener los primeros 5 elementos.)
En caso de que alguien esté interesado (incluso si la pregunta no pide esta versión), en C # 2 sería: (He editado la respuesta, siguiendo algunas sugerencias)
myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);
Para tomar los primeros 5 elementos mejor usar expresiones como esta:
var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5);
o
var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5).OrderBy([ORDER EXPR]);
Será más rápido que la variante orderBy, porque el motor LINQ no escaneará toda la lista debido a la ejecución demorada, y no ordenará toda la matriz.
class MyList : IEnumerable<int>
{
int maxCount = 0;
public int RequestCount
{
get;
private set;
}
public MyList(int maxCount)
{
this.maxCount = maxCount;
}
public void Reset()
{
RequestCount = 0;
}
#region IEnumerable<int> Members
public IEnumerator<int> GetEnumerator()
{
int i = 0;
while (i < maxCount)
{
RequestCount++;
yield return i++;
}
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
#endregion
}
class Program
{
static void Main(string[] args)
{
var list = new MyList(15);
list.Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 5;
list.Reset();
list.OrderBy(q => q).Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 15;
list.Reset();
list.Where(q => (q & 1) == 0).Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
list.Reset();
list.Where(q => (q & 1) == 0).Take(5).OrderBy(q => q).ToArray();
Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
}
}
var firstFiveItems = myList.Take(5);
O para rebanar:
var secondFiveItems = myList.Skip(5).Take(5);
Y, por supuesto, a menudo es conveniente obtener los primeros cinco artículos de acuerdo con algún tipo de orden:
var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);