Ich habe eine List<String>
und ich muss eine Unterliste aus dieser Liste entfernen. Gibt es dafür in .NET 3.5 List-Methoden?
Ich habe eine List<String>
und ich muss eine Unterliste aus dieser Liste entfernen. Gibt es dafür in .NET 3.5 List-Methoden?
Antworten:
Sie möchten List :: GetRange (firstIndex, count). Siehe 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)
Ist es das, wonach du suchst?
Wenn Sie die Unterlistenelemente aus der ursprünglichen Liste löschen möchten, haben Sie folgende Möglichkeiten:
// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
list.Remove(t);
}
Wäre es so einfach wie das Ausführen einer LINQ-Abfrage in Ihrer Liste?
List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();
subList
Java, das eine veränderbare Ansicht in die ursprüngliche Liste enthüllt. Dies verhält sich anders, was möglicherweise nicht sofort offensichtlich ist. Daher hielt ich es für hilfreich, darauf hinzuweisen, um jeden zu unterstützen, der dies später sieht. Außerhalb des Themas möchten Sie vielleicht Yoga oder Meditation oder so etwas aufnehmen. Du bist 0 geworden, um ohne Provokation verrückt zu werden.
Verwenden Sie die Where-Klausel von 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");
In den obigen Anweisungen ist "p" das Objekt, das in der Liste enthalten ist. Wenn Sie also ein Datenobjekt verwendet haben, dh:
public class Client
{
public string Name { get; set; }
}
dann würde dein linq so aussehen:
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");
Mit LINQ:
List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();
Wenn Sie foreach benötigen, benötigen Sie keine ToList:
foreach (string s in l.Skip(1).Take(2)){}
Der Vorteil von LINQ ist, dass Sie, wenn Sie nur ein führendes Element überspringen möchten, Folgendes tun können:
List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}
dh keine Notwendigkeit, sich um Zählung / Länge usw. zu kümmern.
Ihre Sammlungsklasse verfügt möglicherweise über eine Methode, die eine Sammlung (eine Unterliste) basierend auf den zur Definition des Filters übergebenen Kriterien zurückgibt. Erstellen Sie eine neue Sammlung mit der foreach-Schleife und verteilen Sie sie.
Oder lassen Sie die Methode und die Schleife die vorhandene Sammlung ändern, indem Sie ein "gefiltertes" oder "aktives" Flag (Eigenschaft) setzen. Dies könnte funktionieren, könnte aber auch Probleme im Multithread-Code verursachen. Wenn andere Objekte vom Inhalt der Sammlung abhängen, ist dies je nach Verwendung der Daten entweder gut oder schlecht.
Kehren Sie die Elemente in einer Unterliste um
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));
Gibt 0,1,4,3,2,5,6
Range
ist wahr mit ganzzahligem Datentyp. Was ist, wenn Ihr Datentyp ist DataTime
und Sie eine Liste von Datensätzen zwischen zwei bestimmten Daten abrufen müssen?