C# 我在泛型列表中用于检索的方法是否已优化

C# 我在泛型列表中用于检索的方法是否已优化,c#,.net-2.0,C#,.net 2.0,在某个时候会有大量的记录,大约50000条。 考虑到这一点,GetEquipmentRecord方法就可以完成任务。 谢谢你的意见 c#,净2,0 如果不评论您选择的算法,我们不确定它是否有帮助,可以说它可能已经足够优化了 这里有一个O(n)find();例如,使用二进制搜索来搜索排序列表将是O(lgn),而搜索a(或在C#2.0中)将是O(1)。如果您经常调用此函数,则哈希集显然是一种方法 但是瓶颈很少出现在您预期的地方,因此您在这一特定情况下提出的问题意味着,总的来说,稍后的分析实际上会显示

在某个时候会有大量的记录,大约50000条。 考虑到这一点,GetEquipmentRecord方法就可以完成任务。 谢谢你的意见

c#,净2,0


如果不评论您选择的算法,我们不确定它是否有帮助,可以说它可能已经足够优化了

这里有一个O(n)
find()
;例如,使用二进制搜索来搜索排序列表将是O(lgn),而搜索a(或在C#2.0中)将是O(1)。如果您经常调用此函数,则哈希集显然是一种方法


但是瓶颈很少出现在您预期的地方,因此您在这一特定情况下提出的问题意味着,总的来说,稍后的分析实际上会显示,最大的减速发生在其他地方。

通过实现合适的
GetHashCode
方法,并使用
System.Collections.Generic.HashSet
作为备份容器,可以大大加快速度。但是,由于不完全清楚您是如何使用您的类的(即您使用的其他
列表
方法),ymmv。

不,它不是。您的整个构造无法在多任务环境中使用。您正在将要搜索的详细信息存储为类的实例成员。我会利用PLINQ(并行Linq)和常用运算符,也不会从列表本身派生,但会提供如下扩展方法:

public static EquipStatus GetEquipmentRecord(this IEnumerable<EquipStatus> list, int equipmentID, EquipShift shift, DateTime date)
{
  return list.AsParallel().FirstOrDefault(e => e.EquipmentID == equipmentID && e.Shift == shift, e.Date.Date == date.Date);
}
公共静态设备状态GetEquipmentRecord(此IEnumerable列表、int equipmentID、EquipmentShift、DateTime日期)
{
return list.aspallel().FirstOrDefault(e=>e.EquipmentID==EquipmentID&&e.Shift==Shift,e.Date.Date==Date.Date);
}

通过这种方式,可以同时进行多个搜索。

改进您的
checkForEquipRecord
方法的一个明显方法是更改

if ((equip.Date.Date == _date.Date) &&  (equip.EquipmentID == _EquipmentID) && (equip.Shift == _Shift)  )
    return true;
else
    return false;
只需
返回(equipment.Date.Date==\u Date.Date)&&(equipment.EquipmentID=\u EquipmentID)&&(equipment.Shift=\u Shift)


就效率而言,这可能已经是JIT编译器所做的优化。

感谢您的评论……我希望代码首先计算一个日期,然后如果不在范围内,就退出。作为一名新手,我几乎一直处于未经授权的领域。这在.NET2.0中可用吗?好的,你的问题不清楚。不幸的是,这至少是.net3.5和c#3。我把你的问题重新记录了一遍,这样就更清晰了。你知道有什么资源可以提供详细的方法吗。您正在使用.NET2.0吗?如果是,HashSet不可用。但是,如果额外的存储量不是问题,那么您可以始终使用字典的键。这个问题概括了GetHashCode的来龙去脉。。。啊,是的!。。。我们会期望从中获得巨大的回报吗?
public static EquipStatus GetEquipmentRecord(this IEnumerable<EquipStatus> list, int equipmentID, EquipShift shift, DateTime date)
{
  return list.AsParallel().FirstOrDefault(e => e.EquipmentID == equipmentID && e.Shift == shift, e.Date.Date == date.Date);
}
if ((equip.Date.Date == _date.Date) &&  (equip.EquipmentID == _EquipmentID) && (equip.Shift == _Shift)  )
    return true;
else
    return false;