Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么LINQ ToLookup会以object为键执行缓慢_C#_Linq - Fatal编程技术网

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