web-dev-qa-db-fra.com

Comment obtenir une sous-liste en C #

J'ai un List<String> et je dois retirer une sous-liste de cette liste. Existe-t-il des méthodes de liste disponibles pour cela dans .NET 3.5?

70
Thomas Manalil

Vous voulez List :: GetRange (firstIndex, count). Voir 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)

C'est ça que tu cherches?

Si vous cherchez à supprimer les éléments de la sous-liste de la liste d'origine, vous pouvez alors:

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

Serait-ce aussi simple que d'exécuter une requête LINQ sur votre liste?

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

Utilisez la clause 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");

Dans les instructions ci-dessus, "p" est l'objet qui se trouve dans la liste. Donc, si vous avez utilisé un objet de données, à savoir:

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

alors votre linq ressemblerait à ceci:

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");
3
slugster

Votre classe de collection peut avoir une méthode qui renvoie une collection (une sous-liste) en fonction des critères transmis pour définir le filtre. Créez une nouvelle collection avec la boucle foreach et distribuez-la.

Ou, demandez à la méthode et à la boucle de modifier la collection existante en définissant un indicateur (propriété) "filtré" ou "actif". Celui-ci pourrait fonctionner, mais pourrait également provoquer des problèmes dans le code multithread. Si d'autres objets dépendent du contenu de la collection, cela est bon ou mauvais selon la façon dont vous utilisez les données.

0
Doug L.

Inverser les éléments d'une sous-liste

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

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

0
Phillip Ngan

Avec LINQ:

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

Si vous avez besoin de foreach, alors pas besoin de ToList:

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

L'avantage de LINQ est que si vous souhaitez simplement ignorer un élément principal, vous pouvez:

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

c'est-à-dire pas besoin de prendre en compte le nombre/la longueur, etc.

0
jw_