我们如何在C#中过滤List<>中的对象?
发布于 2009-05-22 11:51:05
假设我们有一个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!‘和“大!!”。此示例使用anonymous method。它也可以写成:
List<string> myList = new List<string>();
// ..
List<string> resultList = myList.FindAll(OnlyLargerThanFive);
//..
private static bool OnlyLargerThanFive(string s)
{
return s.Length > 5;
}上面的委托OnlyLargerThanFive也称为Predicate。
发布于 2009-05-22 12:04:07
最好的解决方案是使用lambda:
List<Item> l;
l.FindAll(n => n.Something == SomethingElse);它可以在内部使用foreach,但如果不对整个列表进行迭代,就不能真正过滤。
发布于 2009-05-22 12:09:44
List<>.Find (提供第一个匹配的实例)和List.FindAll()提供所有匹配的实例。具有复杂类型列表的示例如下所示:
我有一份班级报告:
public class Report
{
public string ReportName;
public ReportColumnList ReportColumnList;
}和报告列表
List<Report> reportList;要在列表中查找ReportName = 'MyReport‘的项,代码应为:
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; });请注意,传递给委托的对象应该是用来填充列表的类型。
https://stackoverflow.com/questions/897466
复制相似问题