【问题标题】:How to filter list with objects in C#?如何在 C# 中使用对象过滤列表?
【发布时间】:2016-02-05 00:46:32
【问题描述】:

我有一个班级House,我创建了一个List<House> 和一些新的房子。现在我想过滤我的List' where the Name of the House equals"House 1"`。

我应该如何处理这种情况?

我试过houses.FindAll("House 1"); 但这显示了错误:

参数 1:无法从 'string' 转换为 System.Predicate

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# list filter


    【解决方案1】:

    使用 Linq:

    List<House> houseOnes = houses.Where(house => house.Name == "House 1").ToList();
    

    或者如果你只希望找到 1 个

    House houseOne = houses.SingleOrDefault(house => house.Name == "House 1");
    

    并检查结果是否为 null 以确保您找到它。

    【讨论】:

    • 实际上,如果您只开发一个实体,您应该使用houses.Single(expr)。否则,获得null 值将不是您所期望的。
    • 这有一个好处,它不仅适用于IEnumerable&lt;T&gt;,而不仅仅是List&lt;T&gt;,但略有不同的是它返回一个IEnumerable&lt;T&gt;,在迭代时延迟执行,而不是一个完全填充的List&lt;T&gt;与查找的结果。只是强调每个人的完全不同的行为。
    • @MatiasCicero 我会说,如果您希望恰好使用一次Single,如果您希望最多使用一次,请使用SingleOrDefault .
    • @AdamHouldsworth 我自己说得再好不过了
    【解决方案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&lt;House&gt;,并且在您迭代它之前它实际上不会进行比较(ToList 会这样做)。这称为延迟执行,如果您的原始houses 列表在您迭代之前发生更改,您可能会得到不同的结果,这可能是可取的,也可能不是。通过调用ToList,您可以确保在您拨打电话时,您的结果将反映您的列表状态。

    【讨论】:

      【解决方案3】:

      你需要使用 lambda 表达式来完成它。 List&lt;House&gt; houseOnes = houses.Where(house =&gt; house.Name == "House 1").ToList();

      【讨论】:

      • 感谢您的努力,但已经有人给出了这个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2017-06-14
      • 1970-01-01
      • 2014-08-14
      • 2019-01-24
      • 1970-01-01
      • 2017-07-20
      相关资源
      最近更新 更多