So erhalten Sie eine Unterliste in C #


89

Ich habe eine List<String>und ich muss eine Unterliste aus dieser Liste entfernen. Gibt es dafür in .NET 3.5 List-Methoden?


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. ..
Thomas Manalil

Antworten:


127

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);
}

4
Sie können keine Elemente aus einer Liste entfernen, während Sie sie mit einem foreach durchlaufen .....!
Slugster

Slugster; Ich iteriere über Liste 'b', während ich aus Liste 'a' lösche. Es ist legal :)
Josh

6

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();

1
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 = 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");

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 = 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.


0

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.


0

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


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?
Jogi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.