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 = 5ypageNumberestá 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);