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?
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?
Réponses:
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);
}
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();
subList
de 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.
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");
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.
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.
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
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?