2009-05-22 11 views

Respuesta

18

Digamos que tenemos un List<string> y desea que sólo los elementos en los que la longitud de la cadena es mayor que 5.

La siguiente código devolverá un List<string> con los resultados:

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

resultList Contendrá "mundo"! ¡¡y largo!!'. Este ejemplo usa un anonymous method. También se puede escribir como:

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

//.. 

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

El delegado anterior, OnlyLargerThanFive, también se denomina Predicate.

+0

Buena solución, pero ¿no usará internamente un foreach de todos modos? aunque supongo que Kthevar solo quiso decir que no quería hacer la iteración a sí mismo – RobV

+1

Nuevo en lamdas, ¿cómo es que no puedes hacer myList.FindAll (l => l.Length> 5) –

+0

@RobV: Hace un 'normal' ' para 'loop interno. Corrígeme si estoy equivocado, a nadie. – Razzie

2

Además de la manera contada por @Razzie también puede usar LINQ.

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: - sólo es posible en .NET 3 y por encima de

+1

Hablaba de C# 2.0, que no tiene LINQ. Aparte de eso, estás en lo cierto (aunque usaría la sintaxis lambda en este ejemplo) – Razzie

+0

gracias @Razzie He añadido PS a la respuesta :) – TheVillageIdiot

3

La mejor solución es utilizar lambda:

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

Se puede usar foreach internamente, pero se puede' t realmente filtra sin iterar para toda la lista.

+0

La pregunta es para 2.0 donde no se admite lamda –

+0

Lo siento, no lo hice darse cuenta. – Migol

0

Puede usar LINQ. No he probado esto, pero creo que va a filtrar hacia abajo los elementos de mi lista de rellenos de tartas para mostrar sólo aquellos que comienzan con la letra "P":

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

Totalmente sopló por el hecho de que el OP había dicho C# 2.0. Definitivamente no tiene LINQ, pero esto funcionaría si OP mejorara. – itsmatt

3

Lista <> .find (da primera ocurrencia coincidente) y List.FindAll() da todas las ocurrencias coincidentes. Un ejemplo de una lista de tipos Complex le es como sigue:

Tengo un informe de clase:

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

y una lista de Informe

List<Report> reportList; 

Para encontrar elementos de la lista, donde ReportName = 'MyReport', el código sería:

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

Para obtener el primer informe :

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

Tenga en cuenta que el objeto pasado al delegado debe ser del tipo con la que se rellena la lista.

0

Puede usar LINQ de esta manera.

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

que está funcionando sólo en .NET 3 y superiores.

Cuestiones relacionadas