Comment obtenir une sous-liste en C #

89

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

Thomas Manalil
la source
Pouvez-vous nous montrer un exemple de code de ce que vous avez ou clarifier? Je ne suis pas la question.
David
J'ai une liste disant List <String> list = new list <String> (); Je dois prendre une sous-liste de cette liste, disons de l'index 2 à la longueur 1 ..
Thomas Manalil

Réponses:

129

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 vous recherchez?

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

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
    list.Remove(t);
}
Josh
la source
4
Vous ne pouvez pas supprimer des éléments d'une liste tout en les parcourant avec un foreach .....!
slugster
Slugster; J'itère la liste «b» en supprimant de la liste «a». C'est légal :)
Josh
6

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();
p.campbell
la source
1
Il s'agit d'une copie du segment de la liste d'origine, et non d'une vue sur une partie de la liste d'origine.
Asad Saeeduddin
@Asad Le but de cette réponse était d'illustrer que l'OP pouvait utiliser LINQ. Vous avez souligné que cela crée une copie. Fantastique. Vos talents pourraient probablement être mieux utilisés dans l'édition de cette question pour illustrer le point encore plus finement que je ne l'avais laissé il y a 5,5 ans. Si vous le modifiez, vous obtiendrez du crédit dans la ligue de justice sur Internet du pédantisme, et ce sera bien mérité!
p.campbell
10
Je cherchais ( comme d'autres personnes ) quelque chose de similaire à subListde Java, qui expose une vue modifiable dans la liste d'origine. Cela se comporte différemment, ce qui n'est peut-être pas immédiatement évident, alors j'ai pensé qu'il serait utile de le signaler pour le bénéfice de quiconque verra cela plus tard. Hors sujet, vous voudrez peut-être faire du yoga, de la méditation ou autre; vous êtes passé de 0 à fou furieux sans aucune provocation.
Asad Saeeduddin
3

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 est 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");
slugster
la source
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));
slugster
2

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 inutile 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 s'occuper du nombre / longueur, etc.

jw_
la source
0

Votre classe de collection peut avoir une méthode qui renvoie une collection (une sous-liste) basée sur des critères passés pour définir le filtre. Construisez 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 poblèmes dans le code multithread. Si d'autres objets dépendent du contenu de la collection, c'est bon ou mauvais selon la façon dont vous utilisez les données.

Doug L.
la source
0

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

Phillip Ngan
la source
Rangeest vrai avec un type de données entier. Et si votre type de données est DataTimeet que vous avez besoin de récupérer une liste d'enregistrements entre deux dates spécifiques?
Jogi