如何使用C#中的对象过滤列表?

时间:2015-11-04 13:34:52

标签: c# list filter

我有一个班级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")
    };

3 个答案:

答案 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();