首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#2.0中不使用foreach循环过滤List<>对象

在C#2.0中不使用foreach循环过滤List<>对象
EN

Stack Overflow用户
提问于 2009-05-22 11:47:12
回答 6查看 32K关注 0票数 9

我们如何在C#中过滤List<>中的对象?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-22 11:51:05

假设我们有一个List<string>,您只需要字符串长度大于5的项。

下面的代码将返回一个包含结果的List<string>

代码语言:javascript
复制
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。它也可以写成:

代码语言:javascript
复制
List<string> myList = new List<string>();
// ..
List<string> resultList = myList.FindAll(OnlyLargerThanFive);

//..

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

上面的委托OnlyLargerThanFive也称为Predicate

票数 18
EN

Stack Overflow用户

发布于 2009-05-22 12:04:07

最好的解决方案是使用lambda:

代码语言:javascript
复制
List<Item> l;
l.FindAll(n => n.Something == SomethingElse);

它可以在内部使用foreach,但如果不对整个列表进行迭代,就不能真正过滤。

票数 4
EN

Stack Overflow用户

发布于 2009-05-22 12:09:44

List<>.Find (提供第一个匹配的实例)和List.FindAll()提供所有匹配的实例。具有复杂类型列表的示例如下所示:

我有一份班级报告:

代码语言:javascript
复制
public class Report
{
    public string ReportName;
    public ReportColumnList ReportColumnList;
}

和报告列表

代码语言:javascript
复制
List<Report> reportList;

要在列表中查找ReportName = 'MyReport‘的项,代码应为:

代码语言:javascript
复制
string reportName = "MyReport";
List<Report> myReports = reportList.FindAll(delegate(Report obj) { return obj.ReportName == reportName; });

要获取第一个报告,请执行以下操作:

代码语言:javascript
复制
Report rc = reportList.Find(delegate(Report obj) { return obj.ReportName == reportName; });

请注意,传递给委托的对象应该是用来填充列表的类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/897466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档