¿Cómo podemos filtrar el objeto en la lista <> en C#?Lista de filtros <> objeto sin utilizar el bucle foreach en C# 2.0
Respuesta
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.
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
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
gracias @Razzie He añadido PS a la respuesta :) – TheVillageIdiot
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.
La pregunta es para 2.0 donde no se admite lamda –
Lo siento, no lo hice darse cuenta. – Migol
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;
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
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.
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.
- 1. 'Lista <T>. ForEach()' y mutabilidad
- 2. C#: Cualquier beneficio de la lista <T> .ForEach (...) a lo largo del bucle foreach llanura?
- 3. C# foreach dentro de un bucle Foreach
- 4. Cast lista <int> a la lista <string> en .NET 2.0
- 5. Convertir la lista <MyObject> al Diccionario <obj.string, Lista <obj.ID>>
- 6. Uso de IEnumerable sin el bucle foreach
- 7. Cómo utilizar Locale :: acceptFromHttp sin una lista de filtros?
- 8. C# List <T> .ConvertAll en .NET 2.0
- 9. foreach (Obj derivado en la nueva lista <Base>())
- 10. ¿Por qué la lista <T> .ForEach() implementa un bucle for?
- 11. Establecer propiedades múltiples en una lista <T> ForEach()?
- 12. C# string.replace en el bucle foreach
- 13. DeleteObject() en el bucle foreach
- 14. JSF 2.0: ¿Existe alguna ventaja al utilizar DataModel <T> sobre la lista <T> para aplicaciones CRUD
- 15. Cómo convertir el objeto [] a la lista <string> en una línea de C# 3.0?
- 16. Java bucle foreach: for (i Entero: lista) {...}
- 17. C# - Lista <T> .Remove() siempre elimina el primer objeto en la lista
- 18. actualización Struct en bucle foreach en C#
- 19. Cómo utilizar foreach en C++ cli en el código administrado
- 20. Romper el bucle foreach interno y continuar bucle foreach externo
- 21. Cómo utilizar BinarySearch para la lista <T>
- 22. Counter en bucle foreach en C#
- 23. Lista <int> en C#
- 24. C# varianza problema: Asignación Lista <Derived> como Lista <Base>
- 25. C bucle # foreach con valor de clave
- 26. ¿Cómo puedo convertir IEnumerable <T> en la lista <T> en C#?
- 27. Clasificación Lista <String> en C#
- 28. PHP reparto variable como tipo de objeto en bucle foreach
- 29. Lista <T> .ForEach permite su lista para ser modificado?
- 30. ¿El bucle foreach en C# garantiza un orden de evaluación?
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
Nuevo en lamdas, ¿cómo es que no puedes hacer myList.FindAll (l => l.Length> 5) –
@RobV: Hace un 'normal' ' para 'loop interno. Corrígeme si estoy equivocado, a nadie. – Razzie