如何用C#中的对象过滤列表
本文关键字:对象 过滤 列表 何用 | 更新日期: 2023-09-27 18:20:34
我有一个类House
,我创建了一个带有一些新Houses的List<House>
。现在我想过滤我的List' where the Name of the House equals
"House 1"`。
我应该如何处理这种情况?
我尝试了houses.FindAll("House 1");
,但这显示了错误:
参数1:无法从"string"转换为System.Predicate<"应用程序页面1.House">
class House
{
public House(string name, string location)
{
this.Name = name;
this.Location = location;
}
public string Name { private set; get; }
public string Location { private set; get; }
};
//TODO: fill this with data from the database
List<House> houses= new List<House>
{
new House("House 1", "Location 1"),
new House("House 2", "Location 4"),
new House("House 3", "Location 3"),
new House("House 4", "Location 2")
};
您遇到的问题是必须给FindAll
一个谓词。你可以用lambda
List<House> houseOnes = houses.FindAll(house => house.Name == "House 1");
基本上,你必须告诉它你想对每个项目进行比较。在这种情况下,您可以将Name
属性与您感兴趣的string
值进行比较。
另一种选择是使用Linq
List<House> houseOnes = houses.Where(house => house.Name == "House 1").ToList();
请注意,您必须致电ToList
才能获得列表。如果没有它,你就会有一个IEnumerabl<House>
,在你迭代它之前,它实际上不会进行比较(ToList
就是这样做的)。这被称为延迟执行,如果您的原始houses
列表在迭代之前发生了更改,您可能会得到不同的结果,这可能是可取的,也可能不是可取的。通过调用ToList
,您可以确保在进行该调用时,您的结果将反映您的列表状态。
使用Linq:
List<House> houseOnes = houses.Where(house => house.Name == "House 1").ToList();
或者如果只有1个你希望找到
House houseOne = houses.SingleOrDefault(house => house.Name == "House 1");
并检查结果是否为null以确保找到它。
U需要使用lambda表达式来完成它。List<House> houseOnes = houses.Where(house => house.Name == "House 1").ToList();