在某个时候会有大量的记录,大约50,000。 考虑到这一点是方法GetEquipmentRecord直到任务。 谢谢你的意见。
c#,net 2,0
public enum EquipShift { day, night };
public class EquipStatusList : List<EquipStatus>
{
string SerialFormat = "yyyyMMdd";
int _EquipmentID;
string _DateSerial;
EquipShift _Shift;
public EquipStatus GetEquipmentRecord(int equipmentID, EquipShift shift,
DateTime date)
{
_DateSerial = date.ToString(SerialFormat);
_Shift = shift;
_EquipmentID = equipmentID;
return this.Find(checkforEquipRecord);
}
bool checkforEquipRecord(EquipStatus equip)
{
if ((equip.EquipmentID == _EquipmentID)
&& (equip.Shift == _Shift)
&& (equip.Date.ToString(SerialFormat) == _DateSerial))
return true;
else
return false;
}
}
更新: 我已将评估更改为
if ((equip.Date.Date == _date.Date) && (equip.EquipmentID == _EquipmentID) && (equip.Shift == _Shift) )
不确定它有帮助
答案 0 :(得分:3)
如果没有评论您选择的算法,我们可以说 它可能足够优化。
你那里有一个O(n)find()
;使用二进制搜索搜索排序列表将是O(lg n)并且搜索hash-set(或C#2.0中的Dictionary)将是例如O(1)。如果你经常调用这个函数,哈希集显然会成为你的方法。
但瓶颈很少出现在您预期的位置,因此您在这个特定实例上提出的问题意味着,总的来说,以后的分析实际上会显示其他地方的大幅减速。
答案 1 :(得分:0)
通过实施合适的GetHashCode
方法并使用System.Collections.Generic.HashSet<EquipStatus>
作为支持容器,可以大大提高速度。但是,由于您使用课程的方式并不完全清楚(即您使用的其他List<T>
方法),ymmv。
答案 2 :(得分:0)
不,不是。您的整个构造无法在多任务环境中使用。您正在存储详细信息以搜索该类的实例成员。我会利用PLINQ(Parallel Linq)和通常的运算符,我也不会从List本身派生,但提供这样的扩展方法:
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);
}
这样,可以同时进行多次搜索。
答案 3 :(得分:0)
改善checkForEquipRecord
方法的一个明显方法是更改
if ((equip.Date.Date == _date.Date) && (equip.EquipmentID == _EquipmentID) && (equip.Shift == _Shift) )
return true;
else
return false;
到return (equip.Date.Date == _date.Date) && (equip.EquipmentID == _EquipmentID) && (equip.Shift == _Shift)
就效率而言,它可能已经是JIT编译器所做的优化。