我有一个班级House
,我创建了一个带有一些新房子的List<House>
。现在我想过滤我的List' where the Name of the House equals
“House 1”`。
我应该如何处理这种情况?
我尝试houses.FindAll("House 1");
,但这显示错误:
参数1:无法从'string'转换为System.Predicate&lt;“App.Page1.House”&gt;
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")
};
答案 0 :(得分:8)
您遇到的问题是您必须给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
,您可以确保在拨打电话时结果会反映您的列表状态。
答案 1 :(得分:3)
使用Linq:
List<House> houseOnes = houses.Where(house => house.Name == "House 1").ToList();
或者如果只有1个你希望找到
House houseOne = houses.SingleOrDefault(house => house.Name == "House 1");
并检查结果为null以确保找到它。
答案 2 :(得分:0)
您需要使用lambda表达式来完成它。
List<House> houseOnes = houses.Where(house => house.Name == "House 1").ToList();