代码之家  ›  专栏  ›  技术社区  ›  fishhead

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

  •  1
  • fishhead  · 技术社区  · 16 年前

    在某个时候会有大量的记录,大约5万条。 记住这一点就是GetEquipmentRecord方法。 谢谢你的意见。

    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 回复  |  直到 16 年前
        1
  •  3
  •   Will    16 年前

    不用对你选择的算法发表评论,我们可以这么说 可能是的 足够优化

    你得了O(n) find() 在那里;用二进制搜索来搜索一个排序的列表将是O(lgn)和a hash-set (或 Dictionary 例如,在C#2.0中,将是O(1)。如果您经常调用这个函数,哈希集显然是一种可行的方法。

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

        2
  •  0
  •   spender    16 年前

    通过实现一个合适的 GetHashCode 方法和使用 System.Collections.Generic.HashSet<EquipStatus> 作为背衬容器。但是,由于还不完全清楚你是如何使用你的类的(例如,哪个其他类) List<T>

        3
  •  0
  •   Femaref    16 年前

    不,不是。您的整个构造无法在多任务环境中使用。您正在将要搜索的详细信息存储为类的实例成员。我会利用PLINQ(Parallel 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);
    }
    

        4
  •  0
  •   Ponkadoodle    16 年前

    一个明显的方法来提高你的 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编译器可能已经进行了优化。

    推荐文章