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

9
我们如何在C#中过滤List<>中的对象?
6个回答

18

假设我们有一个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


不错的解决方案,但这样做内部是否仍然会使用foreach呢?虽然我认为Kthevar只是想表达他不想自己进行迭代。 - RobV
1
新手入门lambda,为什么不能使用myList.FindAll(l => l.Length > 5)? - Nick Allen
@RobV:它在内部执行一个“普通”的“for”循环。如果我错了,请任何人纠正我。 - Razzie
好的,你可以这样做,只是它没有在智能感知中显示出来。噢 - Nick Allen
@Nick Allen:这个问题是针对C# 2.0的,它没有匿名委托的lambda语法。 - Rytmis

4

最佳解决方案是使用lambda:

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

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


问题是针对不支持Lambda的2.0版本的。 - Rashmi Pandit

3

List<>.Find(返回第一个匹配项),而List.FindAll()会返回所有匹配项。以下是一个使用复杂类型列表的示例:

我有一个名为Report的类:

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

请注意传递给委托的对象应该是与列表填充类型相同的类型


2
除了@Razzie所说的方法外,您还可以使用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:- 仅在 .NET 3 及以上版本中才可能。

1
他在说C# 2.0,它没有LINQ。除此之外,你是正确的(虽然在这个例子中我会使用lambda语法)。 - Razzie

0
你可以使用 LINQ。虽然我没有测试过,但我相信它会过滤掉我的馅饼填充列表中那些以“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;

完全忽略了 OP 提到的 C# 2.0。肯定没有 LINQ,但如果 OP 升级的话这个可以用。 - itsmatt

0

你可以这样使用LINQ

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

它只能在 .net 3 及以上版本中运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接