Können Sie uns ein Codebeispiel zeigen oder klarstellen, was Sie haben? Ich folge der Frage nicht.
David
Ich habe eine Liste mit der Aufschrift List <String> list = new list <String> (); Ich muss eine Unterliste aus dieser Liste entfernen, etwa von Index 2 bis Länge 1. ..
// I have a List called listList 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);}
Dies ist eine Kopie des Segments der Originalliste, keine Ansicht über einen Teil der Originalliste.
Asad Saeeduddin
@Asad Der Sinn dieser Antwort war zu veranschaulichen, dass das OP LINQ verwenden kann. Sie haben darauf hingewiesen, dass eine Kopie erstellt wird. Fantastisch. Ihre Talente könnten wahrscheinlich besser dazu verwendet werden, diese Frage zu bearbeiten, um den Punkt noch feiner zu veranschaulichen, als ich ihn vor 5,5 Jahren verlassen hatte. Wenn Sie es bearbeiten, erhalten Sie Guthaben in der Internet-Liga der Pedanterie, und es wird gut verdient!
p.campbell
10
Ich ( wie einige andere Leute ) suchte nach etwas ähnlichem wie subListJava, 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.
Asad Saeeduddin
3
Verwenden Sie die Where-Klausel von LINQ:
List<object> x =newList<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:
publicclassClient{publicstringName{get;set;}}
dann würde dein linq so aussehen:
List<Client> x =newList<Client>();
x.Add(newClient(){Name="A"});
x.Add(newClient(){Name="B"});
x.Add(newClient(){Name="C"});
x.Add(newClient(){Name="D"});
x.Add(newClient(){Name="B"});var z = x.Where(p => p.Name=="A");
z = x.Where(p => p.Name=="B");
Verwenden Sie nach der Ausarbeitung mein erstes Beispiel und fügen Sie Folgendes hinzu: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
Slugster
2
Mit LINQ:
List<string> l =newList<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.
int[] l ={0,1,2,3,4,5,6};var res =newList<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));
Rangeist wahr mit ganzzahligem Datentyp. Was ist, wenn Ihr Datentyp ist DataTimeund Sie eine Liste von Datensätzen zwischen zwei bestimmten Daten abrufen müssen?
Antworten:
Sie möchten List :: GetRange (firstIndex, count). Siehe http://msdn.microsoft.com/en-us/library/21k0e39c.aspx
Ist es das, wonach du suchst?
Wenn Sie die Unterlistenelemente aus der ursprünglichen Liste löschen möchten, haben Sie folgende Möglichkeiten:
quelle
Wäre es so einfach wie das Ausführen einer LINQ-Abfrage in Ihrer Liste?
quelle
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:
In den obigen Anweisungen ist "p" das Objekt, das in der Liste enthalten ist. Wenn Sie also ein Datenobjekt verwendet haben, dh:
dann würde dein linq so aussehen:
quelle
Mit LINQ:
Wenn Sie foreach benötigen, benötigen Sie keine ToList:
Der Vorteil von LINQ ist, dass Sie, wenn Sie nur ein führendes Element überspringen möchten, Folgendes tun können:
dh keine Notwendigkeit, sich um Zählung / Länge usw. zu kümmern.
quelle
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.
quelle
Kehren Sie die Elemente in einer Unterliste um
Gibt 0,1,4,3,2,5,6
quelle
Range
ist wahr mit ganzzahligem Datentyp. Was ist, wenn Ihr Datentyp istDataTime
und Sie eine Liste von Datensätzen zwischen zwei bestimmten Daten abrufen müssen?