// 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);
}
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:
publicclassClient
{
publicstring 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");
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.
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.
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));
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?
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); }
la source
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();
la source
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");
la source
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.
la source
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.
la source
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
la source
Range
est vrai avec un type de données entier. Et si votre type de données estDataTime
et que vous avez besoin de récupérer une liste d'enregistrements entre deux dates spécifiques?