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

时间:2009-05-22 11:47:12

标签: c# c#-2.0

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

6 个答案:

答案 0 :(得分: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将包含'世界'!和'大!!'。 此示例使用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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:3)

List&lt;&gt; .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; });

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

答案 3 :(得分: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及以上版本中可能

答案 4 :(得分: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;

答案 5 :(得分:0)

您可以像这样使用LINQ

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

它仅适用于.net 3及以上版本。