我在通用列表中用于检索的方法是否已优化

时间:2010-06-06 22:16:14

标签: c# .net-2.0

在某个时候会有大量的记录,大约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)  )

不确定它有帮助

4 个答案:

答案 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编译器所做的优化。