96 votes

Comment obtenir une sous-liste en C#

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

1 votes

Pouvez-vous nous montrer un exemple de code de ce que vous avez, ou clarifier ? Je ne comprends pas la question.

1 votes

J'ai une liste, disons List<String> list = new list<String>() ; j'ai besoin de prendre une sous-liste de cette liste, disons de l'indice 2 à la longueur-1 .

138voto

Josh Points 1346

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 ce que tu cherches ?

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

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

4 votes

Vous ne pouvez pas supprimer des éléments d'une liste tout en itérant sur eux avec un foreach..... !

1 votes

Slugster ; Je suis en train d'itérer sur la liste 'b' tout en supprimant de la liste 'a'. C'est légal :)

6voto

p.campbell Points 42771

Est-ce que ce serait 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();

1 votes

Il s'agit d'une copie du segment de la liste originale, et non d'une vue sur une partie de la liste originale.

0 votes

@Asad Le but de cette réponse était d'illustrer que le PO pouvait utiliser LINQ. Vous avez fait remarquer qu'il crée une copie. Fantastique. Vos talents pourraient probablement être mieux utilisés en éditant cette question pour illustrer le point encore plus finement que je l'avais laissé il y a 5 ans et demi. Si vous l'éditez, vous serez crédité dans la ligue de justice internet de la pédanterie, et ce sera bien mérité !

12 votes

I ( comme d'autres personnes ) cherchait quelque chose de similaire à subList de Java, qui expose une vue mutable de la liste originale. Le comportement est différent, ce qui n'est peut-être pas immédiatement évident. J'ai donc pensé qu'il serait utile de le signaler à toute personne qui verrait cela plus tard. Hors sujet, vous devriez peut-être vous mettre au yoga ou à la méditation ou quelque chose du genre ; vous êtes devenu fou sans aucune provocation.

3voto

slugster Points 27178

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 déclarations ci-dessus, "p" est l'objet qui se trouve dans la liste. Donc si vous avez utilisé un objet de données, c'est-à-dire :

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

0 votes

Après avoir élaboré, utilisez mon premier exemple et ajoutez ceci : z = x.GetRange(1, 3) ; x.RemoveRange(1, 3) ; x.AddRange(z.OrderByDescending(p => p)) ;

0voto

Doug L. Points 2216

Votre classe de collection pourrait avoir une méthode qui renvoie une collection (une sous-liste) basée sur les critères passés pour définir le filtre. Créez une nouvelle collection à l'aide de la boucle foreach et envoyez-la.

Ou encore, la méthode et la boucle peuvent modifier la collection existante en définissant un indicateur (propriété) "filtré" ou "actif". Cette solution pourrait fonctionner, mais pourrait également causer des problèmes dans un code multithread. Si d'autres objets dépendent du contenu de la collection, c'est une bonne ou une mauvaise chose selon la façon dont vous utilisez les données.

0voto

Phillip Ngan Points 4303

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 votes

Range est vrai avec le type de données integer. que se passe-t-il si votre type de données est DataTime et vous avez besoin de récupérer une liste d'enregistrements entre deux dates spécifiques ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X