0

如何搜索泛型集合以查看对象的属性是否相等?

List<Customer> = customers = GetCustomers();

Customer c = new Customer() { FirstName = "Sam" };

customers.Contains(c); //doesn't work
4

2 回答 2

5

您需要为对象定义“平等”。您可以通过多种方式做到这一点。

  1. 覆盖自身的Equals方法Customer,以便它使用您认为的相等性。
  2. 定义一个自定义比较器,它实现IEqualityComparer了您可以传递给 contains。如果您需要在不同时间使用不同的“平等”定义,或者如果您没有修改类型的能力,请执行此操作。

请注意,任何时候您覆盖Equals一个类型时,覆盖也很重要GetHashCode,反之亦然。确保被定义为相等的任何对象Equals也具有相同的哈希码是很重要的。在这种特殊情况下无关紧要,但在使用基于散列的数据结构时会很重要。

于 2012-12-18T20:54:29.990 回答
1

覆盖 Equals、实现 IEqualityComparer 和覆盖 GetHashCode 需要一些工作。

如果你有 Resharper,你可以生成这些方法

唯一一次我会覆盖 Equals、实现 IEqualityComparer 和覆盖 GetHashCode 是如果我计划在整个应用程序中比较客户。可能还有其他一些原因,例如排序。

如果您只在一个位置进行比较,则 LINQ 扩展为您提供强大的集合方法来查找和检索项目。在去覆盖 Equals 方法的麻烦之前,我会先看看那里。

[TestFixture]
public class ContainsTest
{
    [Test]
    public void TestFind()
    {
        var customers = new List<Customer>
                            {
                                new Customer() {FirstName = "Chuck"},
                                new Customer() {FirstName = Path.GetRandomFileName()},
                                new Customer() {FirstName = Path.GetRandomFileName()},
                                new Customer() {FirstName = Path.GetRandomFileName()},
                                new Customer() {FirstName = Path.GetRandomFileName()},

                            };

        //Get all objects that match
        var findResult = customers.Find(c => c.FirstName =="Chuck");
        var findSingle = customers.Single(c => c.FirstName == "Chuck");

        //Has at least one instance
        customers.Any(c => c.FirstName.Contains("Chuck"));
    }

    public class Customer
    {
        public string FirstName { get; set; }
    }
}
于 2012-12-18T21:12:46.660 回答