¿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 ..
// 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);
}
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:
publicclassClient
{
publicstring 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");
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.
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));
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?
Respuestas:
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); }
fuente
¿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();
fuente
subList
Java, 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.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");
fuente
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.
fuente
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.
fuente
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
fuente
Range
es verdadero con el tipo de datos entero. ¿Qué pasa si su tipo de datos esDataTime
y necesita recuperar una lista de registros entre dos fechas específicas?