如何用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")
    };

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

您遇到的问题是必须给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();