C# Linq查询太慢

C# Linq查询太慢,c#,linq,C#,Linq,我在C#中设置了以下linq查询。CompDotPinNamePinDict字典的类型为,对象有一个名为UniqueNetNames的列表 我正在PCB上建立一个设备引脚集合,我们称之为网络。网络本质上是将设备引脚连接在一起的导线 平均pin字典将包含大约80k个条目。 平均的UniqueNetName列表将包含大约4个条目 以下是我关于linq查询的代码: var uniqueName = dr[0].ToString().ToUpper().Trim(); //Get all of the

我在C#中设置了以下linq查询。CompDotPinNamePinDict字典的类型为
,对象有一个名为UniqueNetNames的
列表

我正在PCB上建立一个设备引脚集合,我们称之为网络。网络本质上是将设备引脚连接在一起的导线

平均pin字典将包含大约80k个条目。 平均的UniqueNetName列表将包含大约4个条目

以下是我关于linq查询的代码:

var uniqueName = dr[0].ToString().ToUpper().Trim();

//Get all of the pins with the associated net names

// BUG - Following .Contains() is 37% of import processing time. Needs optimized.
var values = DataStore.OriginalSolution.CompDotPinNamePinDic.Where(x => uniqueName == x.Key ||
                x.Value.UniqueNetNames.Contains(uniqueName, StringComparer.InvariantCultureIgnoreCase));

foreach (var pin in values)
{
    newNet.AddPin(pin.Value);
}

//If no pins were found, alert the user
if(!newNet.PinListDic.Any())
{
    errors.Add("SRTool:Missing pins in " + newNet.UniqueNetName + "(FFI Net Name). Net not created.");
    continue;
}
之后,我获取pin
值列表
并继续创建我的
网络
。在我所有的导入功能中,49.7%的处理器时间用于上面的linq查询


有人能想出更好的方法从这本字典中提取一组PIN吗?

您可能需要在数据库中添加索引。Contain查询的性能确实不好,所以您应该尝试使用equals重写,并在该列上建立索引。如果UniqueNetNames包含Uniq值,则使用HashSet而不是List。List的包含方法对所有值进行迭代并比较每个字符串,这非常慢。我设置了一些样本数据,有80k条记录,每个记录有4个
UniqeNetNames
条目,您的查询只花了304毫秒。这就是您获得的速度吗?简单地交换比较(uniqueName==x.Key,在.Contains之前)可能会有轻微的不同,因为您首先执行的是较轻的比较。不过,您必须对其进行基准测试,因为这取决于您的数据。如果添加
.ToArray()
提高了性能,则听起来您在查询后对值进行了最小的处理。我认为你需要发布更多的相关代码。实际上,正如您所发布的那样,查询使用了延迟执行,因此无论如何,它只由后面的代码执行。你需要发布代码。