我们如何在C#中过滤List<>中的对象?
假设我们有一个List<string>
,你只想保留字符串长度大于5的项。
下面的代码将返回一个带有结果的List<string>
:
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将包含'world!'和'large!!'。 这个例子使用了一个匿名方法。它也可以写成:
List<string> myList = new List<string>();
// ..
List<string> resultList = myList.FindAll(OnlyLargerThanFive);
//..
private static bool OnlyLargerThanFive(string s)
{
return s.Length > 5;
}
上面的委托OnlyLargerThanFive也被称为Predicate。
最佳解决方案是使用lambda:
List<Item> l;
l.FindAll(n => n.Something == SomethingElse);
它可能在内部使用foreach,但如果不对整个列表进行迭代,你就无法真正过滤。
List<>.Find(返回第一个匹配项),而List.FindAll()会返回所有匹配项。以下是一个使用复杂类型列表的示例:
我有一个名为Report的类:
public class Report
{
public string ReportName;
public ReportColumnList ReportColumnList;
}
以及报告列表
List<Report> reportList;
string reportName = "MyReport";
List<Report> myReports = reportList.FindAll(delegate(Report obj) { return obj.ReportName == reportName; });
获取第一个报告:
Report rc = reportList.Find(delegate(Report obj) { return obj.ReportName == reportName; });
请注意传递给委托的对象应该是与列表填充类型相同的类型。
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;
你可以这样使用LINQ。
List<string> List = new List<string> { "i", "am", "using", "LINQ!" };
List<string> result = myList.Where(s => s.Length > 3).ToList();
它只能在 .net 3 及以上版本中运行。