我们如何过滤List<>中的对象在C#?
答案 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)
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及以上版本。