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);
}
}
}