gpt4 book ai didi

c# - 如何使用列表对象中 3 个属性的搜索条件加快 List<> 上的此 linq 查询

转载 作者:行者123 更新时间:2023-11-30 20:23:35 24 4
gpt4 key购买 nike

我有以下 LINQ 查询。

有一个包含大约 55 000 项的列表。我需要对项目中的三个 属性进行搜索。

这是我的代码:

private List<Device> Devices = _db.Devices.ToList();

public Device TryFindDeviceInNetworks(ALL_Sims sim)
{
var ips = new List<string>();
if (sim.IP1 != null)
{
ips.Add(sim.IP1);
}
if (sim.IP2 != null)
{
ips.Add(sim.IP2);
}

var device =
Devices.FirstOrDefault(
x => ips.Contains(x.IPaddress1)
|| ips.Contains(x.IPaddress2)
|| ips.Contains(x.IPaddress3));

return device;
}

目前这个操作需要一些时间。

我有一个 for 循环遍历大约 100k 个项目,并且在它的每次迭代中调用这个函数 TryFindDeviceInNetworks() .它在英特尔 i5 上运行 8 - 10 小时以上。显然这是单线程的。

我的问题是如何加快速度?我已经将我的一些列表转换为我可以在应用程序中使用的字典,这有很大帮助,但是在这种情况下,我不能只搜索一个键吗?

是否有某种数据结构比 List<T> 更适合? ?

数据库不在本地 LAN 上,因此估计每次迭代至少需要 ~40 毫秒 + 查询时间的 ping。

最佳答案

您可以拥有 3 个字典,而不是拥有一个包含所有 3 个 IP 地址的字典:

private List<Device> Devices = new List<Device>();

private Dictionary<string, Device> mapIP1;
private Dictionary<string, Device> mapIP2;
private Dictionary<string, Device> mapIP3;

你必须在搜索之前初始化它们:

public void InitializeDictionaries()
{
mapIP1 = Devices.ToDictionary(x => x.IPaddress1);
mapIP2 = Devices.ToDictionary(x => x.IPaddress2);
mapIP3 = Devices.ToDictionary(x => x.IPaddress3);
}

搜索本身可以使用TryGetValue :

public Device TryFindDeviceInNetworks(ALL_Sims sim)
{
Device device = null;

if (sim.IP1 != null)
{
if (mapIP1.TryGetValue(sim.IP1, out device))
return device;
if (mapIP2.TryGetValue(sim.IP1, out device))
return device;
if (mapIP3.TryGetValue(sim.IP1, out device))
return device;
}

if (sim.IP2 != null)
{
if (mapIP1.TryGetValue(sim.IP2, out device))
return device;
if (mapIP2.TryGetValue(sim.IP2, out device))
return device;
if (mapIP3.TryGetValue(sim.IP2, out device))
return device;
}

return device;
}

您必须确保 Devices 中没有元素共享相同地址的列表,如Dictionary<TKey, TValue>不能使用重复键。

关于c# - 如何使用列表对象中 3 个属性的搜索条件加快 List<> 上的此 linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com