2009-05-22 16 views

Antwort

18

Lassen Sie uns sagen, dass wir eine List<string> haben, und Sie wollen nur die Punkte, in denen die Länge der Zeichenfolge größer als 5.

Der folgende Code wird eine List<string> mit den Ergebnissen zurück:

List<string> myList = new List<string>(); 
myList.Add("hello"); 
myList.Add("world!"); 
myList.Add("one"); 
myList.Add("large!!"); 
List<string> resultList = myList.FindAll(delegate(string s) { return s.Length > 5; }); 

Ergebnisliste wird "Welt" enthalten! und groß!!'. In diesem Beispiel wird anonymous method verwendet. Es kann auch geschrieben werden als:

List<string> myList = new List<string>(); 
// .. 
List<string> resultList = myList.FindAll(OnlyLargerThanFive); 

//.. 

private static bool OnlyLargerThanFive(string s) 
{ 
    return s.Length > 5; 
} 

Der Delegierte oben, OnlyLargerThanFive, auch eine Predicate genannt wird.

+0

Schöne Lösung, aber wird dies nicht intern eine Foreach sowieso verwenden? obwohl ich davon ausgehe, dass Kthevar nur meinte, dass er das Iterieren nicht selbst machen wollte. – RobV

+1

Neu bei Lamdas, wie kommt es, dass du meineListe nicht tun kannst.FindAll (l => l.Length> 5) –

+0

@RobV: Es ist ein 'normales' für 'Schleife intern. Korrigiere mich, wenn ich falsch liege, irgendjemand. – Razzie

2

neben dem Weg von @Razzie erzählt können Sie auch LINQ verwenden.

List<string> myList = new List<string>(); 
myList.Add("hello"); 
myList.Add("world!"); 
myList.Add("one"); 
myList.Add("large!!"); 

var filtered=from s in myList where s.Length > 5 select s; 

PS: - ist nur in .NET 3 und höher

+1

Er sprach über C# 2.0, das nicht über LINQ verfügt. Ansonsten sind Sie richtig (obwohl ich die Lambda-Syntax in diesem Beispiel verwenden würde) – Razzie

+0

danke @Razzie Ich habe PS zur Antwort hinzugefügt :) – TheVillageIdiot

3

Die beste Lösung ist Lambda zu verwenden:

List<Item> l; 
l.FindAll(n => n.Something == SomethingElse); 

Es kann intern foreach verwenden, aber Sie können‘ t Filtere wirklich, ohne für die ganze Liste zu iterieren.

+0

Frage ist für 2.0, wo Lamda nicht unterstützt wird –

+0

Sorry, tat nicht beachten. – Migol

0

Sie könnten LINQ verwenden. Ich habe nicht getestet, aber ich glaube, es wird die Elemente meiner Liste der Pastetenfüllungen nur diejenigen zu zeigen, unten filtern, die mit einem „P“ beginnen:

List<string> list = new List<string>(); 

list.Add("Apple"); 
list.Add("Peach"); 
list.Add("Chocolate"); 
list.Add("Pear"); 
list.Add("Pumpkin"); 
list.Add("Cherry"); 
list.Add("Coconut"); 


var filteredOnes = from item in list 
        where item.StartsWith("P") 
        select item; 
+0

Total blies durch die Tatsache, dass der OP C# 2.0 gesagt hatte. Definitiv hat LINQ nicht, aber das würde funktionieren, wenn das OP aktualisiert wird. – itsmatt

3

Liste <> .Find (das gibt erste übereinstimmende Vorkommen) und List.FindAll() liefert alle übereinstimmenden Vorkommen. Ein Beispiel mit einer Liste von komplexen Typen würden, ist wie folgt:

Ich habe eine Klasse Report:

public class Report 
{ 
    public string ReportName; 
    public ReportColumnList ReportColumnList; 
} 

und eine Liste des Berichts

List<Report> reportList; 

Um Elemente in der Liste zu finden, wo ReportName = 'MyReport', der Code wäre:

string reportName = "MyReport"; 
List<Report> myReports = reportList.FindAll(delegate(Report obj) { return obj.ReportName == reportName; }); 

Um den ersten Bericht zu erhalten :

Report rc = reportList.Find(delegate(Report obj) { return obj.ReportName == reportName; }); 

Beachten Sie, dass das Objekt an den Delegaten übergeben des Typs, mit dem sollte die Liste bevölkert ist.

0

Sie können LINQ so verwenden.

List<string> List = new List<string> { "i", "am", "using", "LINQ!" }; List<string> result = myList.Where(s => s.Length > 3).ToList();

es funktioniert nur in .net 3 und höher.

Verwandte Themen