【问题标题】:List contains list列表包含列表
【发布时间】:2016-06-09 19:45:43
【问题描述】:

您好,我有以下列表:

 var CustomerName = new List<Customer>();
 var DummyData = new List<Customer>();

如何快速检查 DummyData 是否包含在 CustomerName 中?性能也是关键,因为这些列表可能包含数千个值。

【问题讨论】:

标签: c# contains


【解决方案1】:

蛮力法

对 DummyData 变量 O(N*K) 使用 linq all 方法

// If you override Equals and GetHashCode or are comparing by reference
DummyData.All(a=>CustomerName.Contains(a))

//If you compare by property
DummyData.All(a=>
               CustomerName.Any(b=>
                   a.FirstName==b.FirstName && 
                   a.LastName == b.LastName
                   //repeat to include checks for all properties
              )
          );

使用哈希集

将你的结果放入一个hashset,再次使用linq的All方法检查hashset是否包含项目,构建hashset需要N步,检查k步,复杂度为O(N+K)

var hs = new HashSet<Customer>(CustomerName);
DummyData.All(a=>hs.Contains(a));

您需要覆盖 Equals 和 GetHashCode

如果你还没有覆盖这两个,除非你想比较属性,否则你需要这样做,这也会阻止你使用哈希集方法

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override bool Equals(object obj)
    {
        var customer = obj as Customer;
        return customer != null && Equals(customer);
    }

    protected bool Equals(Customer other)
    {
        return string.Equals(FirstName, other.FirstName) && string.Equals(LastName, other.LastName);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return ((FirstName?.GetHashCode() ?? 0)*397) ^ (LastName?.GetHashCode() ?? 0);
        }
    }
}

【讨论】:

  • 我会注意到,这使用 reference 相等性,除非您被覆盖 EqualsGetHashCode
  • 蛮力不起作用,当我做布尔时它返回 false
  • @Elsid 你重写了 Equals 和 GetHashCode 方法吗?无论提供的两个示例,您都需要这样做
  • 有没有办法在不覆盖 Equals 的情况下做到这一点?
  • @Konkked 没有名字或姓氏,列表只包含返回给它的值。示例:CustomerName(0)="ABC Company" 等。等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多