Como Conseguir um Sublista em C #

91

Eu tenho um List<String>e preciso retirar uma sublista desta lista. Existe algum método de Lista disponível para isso no .NET 3.5?

Thomas Manalil
fonte
Você pode nos mostrar um exemplo de código do que você tem ou esclarecer? Não estou entendendo a pergunta.
David
Tenho uma lista que diz List <String> list = new list <String> (); preciso retirar uma sublista desta lista, digamos, do índice 2 ao comprimento-1.
Thomas Manalil

Respostas:

131

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);
}
Josh
fonte
4
Você não pode remover itens de uma lista durante a iteração sobre eles com um foreach .....!
slugster
Slugster; Estou iterando na lista 'b' enquanto excluo da lista 'a'. É legal :)
Josh
6

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();
p.campbell
fonte
1
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:

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");
slugster
fonte
Depois de elaborado, use meu primeiro exemplo e adicione este: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
slugster
2

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.

jw_
fonte
0

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.

Doug L.
fonte
0

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

Phillip Ngan
fonte
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?
Jogi de