// 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)
É isso que você quer?
Se você deseja excluir os itens da sublista da lista original, pode:
// list is our original list// sublist is our (newly created) sublist built from GetRange()foreach (Type t in sublist)
{
list.Remove(t);
}
Esta é uma cópia do segmento da lista original, não uma visualização de uma parte da lista original.
Asad Saeeduddin
@Asad O objetivo desta resposta era ilustrar que o OP poderia usar o LINQ. Você observou que isso cria uma cópia. Fantástico. Provavelmente, seus talentos poderiam ser melhor usados na edição desta questão para ilustrar o ponto ainda mais detalhadamente do que eu o havia deixado há 5,5 anos. Se você editá-lo, receberá crédito na liga de pedantismo da justiça da Internet, e será bem merecido!
p.campbell
11
Eu ( como algumas outras pessoas ) estava procurando por algo semelhante em subListJava, que expõe uma visão mutável na lista original. Isso se comporta de maneira diferente, o que pode não ser imediatamente óbvio, então achei que seria útil apontá-lo para o benefício de quem vir isso mais tarde. Fora do assunto, você pode querer fazer ioga ou meditação ou algo assim; você foi de 0 a louco com o rosto vermelho sem qualquer provocação.
Asad Saeeduddin
3
Use a cláusula Where do 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");
Nas afirmações acima, "p" é o objeto que está na lista. Então, se você usou um objeto de dados, ou seja:
publicclassClient
{
publicstring Name { get; set; }
}
então seu linq ficaria assim:
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");
Sua classe de coleção pode ter um método que retorna uma coleção (uma sublista) com base nos critérios passados para definir o filtro. Construa uma nova coleção com o loop foreach e distribua.
Ou faça com que o método e o loop modifiquem a coleção existente definindo um sinalizador (propriedade) "filtrado" ou "ativo". Este poderia funcionar, mas também poderia causar problemas em código multithread. Se outros objetos dependerem do conteúdo da coleção, isso é bom ou ruim, dependendo de como você usa os dados.
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));
Rangeé verdadeiro com o tipo de dados inteiro. e se o seu tipo de dados for DataTimee você precisar recuperar uma lista de registros entre duas datas específicas?
Respostas:
Você quer List :: GetRange (firstIndex, count). Consulte 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)
É isso que você quer?
Se você deseja excluir os itens da sublista da lista original, pode:
// list is our original list // sublist is our (newly created) sublist built from GetRange() foreach (Type t in sublist) { list.Remove(t); }
fonte
Seria tão fácil quanto executar uma consulta LINQ em sua lista?
List<string> mylist = new List<string>{ "hello","world","foo","bar"}; List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();
fonte
subList
Java, que expõe uma visão mutável na lista original. Isso se comporta de maneira diferente, o que pode não ser imediatamente óbvio, então achei que seria útil apontá-lo para o benefício de quem vir isso mais tarde. Fora do assunto, você pode querer fazer ioga ou meditação ou algo assim; você foi de 0 a louco com o rosto vermelho sem qualquer provocação.Use a cláusula Where do 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");
Nas afirmações acima, "p" é o objeto que está na lista. Então, se você usou um objeto de dados, ou seja:
public class Client { public string Name { get; set; } }
então seu linq ficaria assim:
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");
fonte
Com LINQ:
List<string> l = new List<string> { "1", "2", "3" ,"4","5"}; List<string> l2 = l.Skip(1).Take(2).ToList();
Se você precisa de foreach, não há necessidade de ToList:
foreach (string s in l.Skip(1).Take(2)){}
A vantagem do LINQ é que, se você deseja apenas pular algum elemento principal, você pode:
List<string> l2 = l.Skip(1).ToList(); foreach (string s in l.Skip(1)){}
ou seja, não há necessidade de cuidar da contagem / comprimento, etc.
fonte
Sua classe de coleção pode ter um método que retorna uma coleção (uma sublista) com base nos critérios passados para definir o filtro. Construa uma nova coleção com o loop foreach e distribua.
Ou faça com que o método e o loop modifiquem a coleção existente definindo um sinalizador (propriedade) "filtrado" ou "ativo". Este poderia funcionar, mas também poderia causar problemas em código multithread. Se outros objetos dependerem do conteúdo da coleção, isso é bom ou ruim, dependendo de como você usa os dados.
fonte
Reverter os itens em uma 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));
Dá 0,1,4,3,2,5,6
fonte
Range
é verdadeiro com o tipo de dados inteiro. e se o seu tipo de dados forDataTime
e você precisar recuperar uma lista de registros entre duas datas específicas?