2009-11-11 5 views
56

J'ai un List<String> et j'ai besoin de prendre une sous-liste de cette liste. Existe-t-il des méthodes de liste disponibles pour cela dans .NET 3.5?Comment obtenir une sous-liste en C#

+0

Pouvez-vous nous montrer un exemple de code de ce que vous avez, ou clarifient ? Je ne suis pas la question. – David

+0

ya 3.5 .. désolé pour la faute de frappe .. –

+0

J'ai une liste dire Liste liste = nouvelle liste (); je dois prendre une sous-liste de cette liste dire de l'index 2 à la longueur-1 .. –

Répondre

79

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) 

Est-ce que vous êtes après?

Si vous cherchez à supprimer les éléments de sous-liste de la liste initiale, vous pouvez faire:

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

ouais ceci l'un ... Maintenant je dois inverser le contenu de la sous-liste et le remettre à la liste d'origine –

+3

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

+0

Bien que vous devriez être capable de vous manipuler. :) – Josh

5

Serait-il aussi facile 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

Ceci est une copie du segment de la liste d'origine, pas une vue sur une partie de la liste d'origine. –

+0

@Asad Le but de cette réponse était d'illustrer que l'OP pouvait utiliser LINQ. Vous avez indiqué 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 fin que je l'avais laissé il y a 5,5 ans. Si vous l'éditez, vous obtiendrez le crédit dans la ligue de pédanterie de la justice Internet, et ce sera bien gagné! –

+8

I ([comme d'autres personnes] (http: // stackoverflow.com/questions/1287340/net-equivalent-de-javas-list-sublist)) cherchait quelque chose de similaire à 'subList' de Java, qui expose une vue mutable dans la liste originale. Cela se comporte différemment, ce qui peut ne pas être immédiatement évident, alors j'ai pensé qu'il serait utile de le signaler pour le bénéfice de quiconque voit cela plus tard. Hors sujet, vous pourriez vouloir prendre le yoga ou la méditation ou quelque chose; vous êtes allé à la folie sans aucune provocation. –

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

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

0

Votre classe de collection pourrait avoir une méthode qui retourne une collection (une sous-liste) en fonction des critères passé pour définir le filtre. Construisez une nouvelle collection avec la boucle foreach et transmettez-la. Ou, faites modifier la collection existante par la méthode et la boucle en définissant un drapeau "filtré" ou "actif" (propriété). Celui-ci pourrait fonctionner mais pourrait aussi causer des problèmes dans le code multithread. Si d'autres objets sont déformés sur le contenu de la collection, c'est bon ou mauvais selon la façon dont vous utilisez les données.

0

Inverser les éléments dans 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

'Range' est vrai avec un type de données entier. Et si votre type de données est 'DataTime' et que vous avez besoin de récupérer une liste d'enregistrements entre deux dates spécifiques? – Jogi

Questions connexes