C# 列表包含列表

C# 列表包含列表,c#,contains,C#,Contains,嗨,我有以下清单: var CustomerName = new List<Customer>(); var DummyData = new List<Customer>(); var CustomerName=newlist(); var DummyData=新列表(); 如何快速检查DummyData是否包含在CustomerName中?此外,性能也是关键,因为这些列表可能包含数千个值。暴力方法 对DummyData变量使用linq all方法O(N*K) 使

嗨,我有以下清单:

 var CustomerName = new List<Customer>();
 var DummyData = new List<Customer>();
var CustomerName=newlist();
var DummyData=新列表();
如何快速检查DummyData是否包含在CustomerName中?此外,性能也是关键,因为这些列表可能包含数千个值。

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

使用哈希集 将结果放入哈希集中,再次使用linq的
All
方法检查哈希集是否包含项,需要N个步骤构建哈希集,K个步骤进行检查,复杂性为
O(N+K)

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

使用哈希集 将结果放入哈希集中,再次使用linq的
All
方法检查哈希集是否包含项,需要N个步骤构建哈希集,K个步骤进行检查,复杂性为
O(N+K)


为什么你的问题有一个sql标记,但使用的是两个变量的列表?为什么你的问题有一个sql标记,但使用的是两个变量的列表?可能的重复我要注意,这使用引用相等,除非你被覆盖
Equals
GetHashCode
。蛮力不起作用当我执行一个命令时,它返回falsebool@Elsid您是否重写了Equals和GetHashCode方法?无论提供的两个示例如何,您都需要这样做。有没有不重写Equals的方法?@Konkked没有名字或姓氏,列表只包含返回给它的值。示例:CustomerName(0)=“ABC公司”等。我要注意的是,除非您被覆盖
Equals
GetHashCode
,否则它使用引用相等。蛮力不起作用,当我执行bool@Elsid您是否重写了Equals和GetHashCode方法?无论提供的两个示例如何,您都需要这样做。有没有不重写Equals的方法?@Konkked没有名字或姓氏,列表只包含返回给它的值。示例:CustomerName(0)=“ABC公司”等。发射型计算机断层扫描仪。
// 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
              )
          );
var hs = new HashSet<Customer>(CustomerName);
DummyData.All(a=>hs.Contains(a));
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);
        }
    }
}