Cómo obtener una sublista en C #

89

Tengo una List<String>y necesito sacar una sublista de esta lista. ¿Hay algún método de lista disponible para esto en .NET 3.5?

Thomas Manalil
fuente
¿Puede mostrarnos una muestra de código de lo que tiene o aclarar? No estoy siguiendo la pregunta.
David
Tengo una lista que dice List <String> list = new list <String> (); Tengo que tomar una lista secundaria de esta lista digamos de índice 2 a la longitud-1 ..
Thomas Manalil

Respuestas:

129

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

¿Es eso lo que buscas?

Si está buscando eliminar los elementos de la sublista de la lista original, puede hacer lo siguiente:

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
    list.Remove(t);
}
Josh
fuente
4
¡No puede eliminar elementos de una lista mientras itera sobre ellos con un foreach .....!
slugster
Slugster; Estoy iterando sobre la lista 'b' mientras elimino de la lista 'a'. Es legal :)
Josh
6

¿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();
p.campbell
fuente
1
Esta es una copia del segmento de la lista original, no una vista de una parte de la lista original.
Asad Saeeduddin
@Asad El objetivo de esta respuesta fue ilustrar que el OP podría usar LINQ. Ha señalado que crea una copia. Fantástico. Probablemente sus talentos podrían utilizarse mejor 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 edita, obtendrá crédito en la liga de pedantería de la justicia de Internet, ¡y se lo ganará bien!
p.campbell
10
Yo ( como algunas otras personas ) estaba buscando algo similar a subListJava, que expone una vista mutable en la lista original. Esto se comporta de manera diferente, lo que podría no ser obvio de inmediato, por lo que pensé que sería útil señalarlo en beneficio de cualquiera que lo vea más adelante. Fuera del tema, es posible que desee comenzar a practicar yoga o meditación o algo; pasaste 0 a la locura enrojecida sin provocación alguna.
Asad Saeeduddin
3

Utilice la cláusula Where de LINQ:

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. Entonces, si usó un objeto de datos, es decir:

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

entonces tu 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");
babosa
fuente
Después de elaborarlo, use mi primer ejemplo y agregue esto: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
slugster
2

Con LINQ:

List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();

Si necesita foreach, entonces no necesita ToList:

foreach (string s in l.Skip(1).Take(2)){}

La ventaja de LINQ es que si solo desea omitir algún elemento principal, puede:

List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}

es decir, no es necesario ocuparse del recuento / longitud, etc.

jw_
fuente
0

Su clase de colección podría tener un método que devuelva una colección (una sublista) según los criterios pasados ​​para definir el filtro. Construya una nueva colección con el bucle foreach y distribúyala.

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

Doug L.
fuente
0

Invertir los elementos de una sublista

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

Phillip Ngan
fuente
Rangees verdadero con el tipo de datos entero. ¿Qué pasa si su tipo de datos es DataTimey necesita recuperar una lista de registros entre dos fechas específicas?
Jogi