2009-11-11 13 views
56

Tengo un List<String> y necesito tomar una sublista de esta lista. ¿Hay algún método de Lista disponible para esto en .NET 3.5?Cómo obtener una sublista en C#

+0

nos muestras un ejemplo de código de lo que tiene, o aclarar ? No estoy siguiendo la pregunta. – David

+0

ya 3.5 ..sorry para el error tipográfico ... –

+0

Tengo una lista decir List list = new list (); Necesito tomar una sublista de esta lista decir desde el índice 2 a la longitud-1 .. –

Respuesta

79

Desea List :: GetRange (firstIndex, count). Ver http://msdn.microsoft.com/en-us/library/21k0e39c.aspx

// I have a List called list 
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9) 
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3) 

¿Eso es lo que buscas?

Si usted está mirando para eliminar los elementos sublista de la lista original, a continuación, puede hacer:

// list is our original list 
// sublist is our (newly created) sublist built from GetRange() 
foreach (Type t in sublist) 
{ 
    list.Remove(t); 
} 
+0

Sí, este es el ... Ahora necesito revertir el contenido de la sublista y ponerlo de nuevo en la lista original –

+3

No se puede eliminar elementos de una lista mientras se itera sobre ellos con un foreach .....! – slugster

+0

Bueno, debería poder manejarse solo. :) – Josh

5

¿Sería tan fácil como ejecutar una consulta LINQ en su lista?

List<string> mylist = new List<string>{ "hello","world","foo","bar"}; 
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList(); 
+1

Esta es una copia del segmento de la lista original, no una vista sobre una parte de la lista original. –

+0

@ Asad El objetivo de esta respuesta fue ilustrar que el OP podría usar LINQ. Usted ha señalado que crea una copia. Fantástico. Sus talentos probablemente podrían ser mejor utilizados en la edición de esta pregunta para ilustrar el punto aún mejor de lo que lo había dejado hace 5.5 años. ¡Si lo editas, obtendrás crédito en la liga de pedantería de internet justice, y será bien ganado! –

+8

I ([como algunas otras personas] (http: // stackoverflow.com/questions/1287340/net-equivalent-of-javas-list-sublist)) estaba buscando algo similar a 'subList' de Java, que expone una vista mutable en la lista original. Esto se comporta de manera diferente, lo que puede no ser inmediatamente obvio, así que pensé que sería útil señalarlo en beneficio de cualquiera que vea esto más adelante. Fuera del tema, es posible que desee practicar yoga o meditación o algo así; fuiste 0 a la locura de rojo en la cara sin ninguna provocación de ningún tipo. –

3

utilizar la cláusula de LINQ Dónde:

List<object> x = new List<object>(); 
x.Add("A"); 
x.Add("B"); 
x.Add("C"); 
x.Add("D"); 
x.Add("B"); 

var z = x.Where(p => p == "A"); 
z = x.Where(p => p == "B"); 

En las declaraciones anteriores "p" es el objeto que está en la lista. Por lo tanto si se ha utilizado un objeto de datos, es decir:

public class Client 
{ 
    public string Name { get; set; } 
} 

entonces su LINQ se vería así:

List<Client> x = new List<Client>(); 
x.Add(new Client() { Name = "A" }); 
x.Add(new Client() { Name = "B" }); 
x.Add(new Client() { Name = "C" }); 
x.Add(new Client() { Name = "D" }); 
x.Add(new Client() { Name = "B" }); 

var z = x.Where(p => p.Name == "A"); 
z = x.Where(p => p.Name == "B"); 
+0

Después de elaborar, use mi primer ejemplo y agregue esto: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p)); – slugster

0

Su clase de colección podría tener un método que devuelve una colección (una lista secundaria) sobre la base de criterios pasó para definir el filtro. Crea una nueva colección con el ciclo foreach y distribúyelo.

O bien, haga que el método y el bucle modifiquen la colección existente estableciendo una marca (propiedad) "filtrada" o "activa". Esto podría funcionar, pero también podría causar problemas en el código multiproceso. Si otros objetos se apropian de los contenidos de la colección, esto es bueno o malo dependiendo de cómo se usen los datos.

0

revertir los artículos en una sub-lista

int[] l = {0, 1, 2, 3, 4, 5, 6}; 
var res = new List<int>(); 
res.AddRange(l.Where((n, i) => i < 2)); 
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse()); 
res.AddRange(l.Where((n, i) => i > 4)); 

Da 0,1,4,3,2,5,6

+0

'Range' es verdadero con el tipo de datos entero. ¿y si su tipo de datos es 'DataTime' y necesita recuperar una lista de registros entre dos fechas específicas? – Jogi

Cuestiones relacionadas