2009-08-17 10 views

Respuesta

10

usando LINQ

list.Skip(fromRange).Take(toRange - fromRange) 
+2

¿Esto devuelve una vista en la lista original o una copia del rango? –

+0

Funciona en IList, no solo en List, esto es lo que estaba buscando. – ripper234

+1

@Joachim Sauer: Esta es una consulta y su resultado depende de cómo se evalúa. Mientras evalúa, recorre los elementos de la lista aplicando alguna regla. Esto no es directamente analógico para la función subList de Java, y es un error compararlos en este caso. – Kamarey

9

Para el genérico List<T>, es el método GetRange(int, int).

Editar: tenga en cuenta que esta es una copia superficial, no una 'vista' en el original. No creo que C# ofrezca esa funcionalidad exacta.

Edit2: como señala Kamarey, usted puede tener una vista de sólo lectura:

List<int> integers = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 }; 
IEnumerable<int> view = integers.Skip(2).Take(3); 
integers[3] = 42; 

foreach (int i in view) 
    // output 

Lo anterior imprimirá 7, 42, 9.

+2

De la documentación de MSDN (http://msdn.microsoft.com/en-us/library/21k0e39c.aspx) que haga no parece ser el mismo: GetRange() devuelve una copia superficial, mientras que subList() devuelve una vista (es decir los cambios en la sublista() se reflejarán en la lista original!) –

+0

bien, tienes razón. No estoy seguro de si este es el requisito exacto, pero voy a editar mi respuesta para reflejar eso. – Razzie

1

GetRange es su respuesta

+3

Nuevamente: no es * exactamente * lo mismo, ya que devuelve una copia superficial en lugar de una vista. Devolver una vista permite algunos trucos bastante ingeniosos (por ejemplo, no es necesario proporcionar un método RemoveRange(), ya que se puede escribir fácilmente como list.subList (x, y) .clear()). –

+0

Honestamente debo decir que realmente no veo los beneficios. Además, removeRange() y subList.clear() no suenan como lo mismo, ya que borrar no debería ser lo mismo que eliminar un rango. Pero bueno :-) – Razzie

+5

Tan pronto como asimile el concepto de que subList() devuelve una vista a la lista original (y no a una copia), será obvio que someList.subList (1,3) .clear() eliminar objetos de la lista original. Y la parte más importante no es si es mejor o no, sino que subList() y GetRange() no hacen lo mismo, por lo que no se deben presentar como equivalentes (al menos no sin una exención de responsabilidad). –