C# 为什么LINQ ToLookup会以object为键执行缓慢
我有以下代码:C# 为什么LINQ ToLookup会以object为键执行缓慢,c#,linq,C#,Linq,我有以下代码: var data = dc.table.ToLookup(x => new ComboObject() { PartnerId = x.Partner_ID, CustomerId = x.Customer_ID_ }, y => y); 这段代码正在创建一个查找,其中键是“ComboObject”对象,值是来自“dc.table”的关联结果 我的问题是,这段代码的性能不是很好。查询生产数据时,该行大约需要10分钟。在今天做了一些挖掘之后,我发现如
var data = dc.table.ToLookup(x => new ComboObject()
{
PartnerId = x.Partner_ID,
CustomerId = x.Customer_ID_
},
y => y);
这段代码正在创建一个查找,其中键是“ComboObject”对象,值是来自“dc.table”的关联结果
我的问题是,这段代码的性能不是很好。查询生产数据时,该行大约需要10分钟。在今天做了一些挖掘之后,我发现如果我将键改为字符串(在这里我连接了PartnerId和CustomerId值),那么代码的运行速度将提高99%。所以,好消息是。。我修好了程序错误坏消息是。。我不知道为什么
所以我的问题是:为什么基于字符串的键比基于对象的键性能好得多
哦,如果你好奇的话,我的ComboObject类看起来像:
public struct ComboObject
{
public string PartnerId { get; set; }
public string CustomerId { get; set; }
public override string ToString()
{
return string.Format("{0}/{1}", PartnerId, CustomerId);
}
}
ComboObject
是否有一个IEquatable
实现?请注意,您的类是为引用相等而设置的,因此只有相同的对象才会进入相同的查找列表。如果您想要两个ID上的相等,您应该在该类中重写Equals
和GetHashCode
。您没有在ComboObject
上重写Equals
或GetHashCode
,因此所有比较都将是引用比较。这也可能产生与使用字符串键查找不同(更大)的结果,因为没有相等的比较。您也可以尝试使用元组
而不是组合对象
?谢谢@RobertHarvey!不,它没有实现IEquatable..谢谢你的提示@juharr