Linq是否可以直接使用字典?

时间:2015-12-12 16:57:49

标签: c# dictionary

我在List中使用自定义类(Price,Quantity,DateTime)进行高速应用。我要么添加到列表中,如果找不到价格,要么使用订单数量和日期时间更新它,然后在列表上运行查询以按顺序数量一遍又一遍地提取前4个事件。该代码在前半个小时运行良好,之后成千上万条记录陷入困境。我想过尝试一本字典,因为索引,但无法弄清楚更新和Linq语句。

  1. Linq是否可以直接使用字典中的字段,例如使用自定义类或结构来提取前4个字符?如果是这样,一个简短的例子就会很棒

  2. 从具有更新的订单数量和日期时间的TryGetValue执行后,我可以直接更新字典字段吗? 如果是这样,一个简短的例子就会很棒

  3. ...或者词典不是继续进行的方式,记住速度至关重要吗?

  4. 感谢任何帮助。

    List<PriceLevel> TrackPrice = new List<PriceLevel>();
            decimal loopLast=0;//sample only
            int loopLastQuantity=0;//sample only
            DateTime inputDateDT=DateTime.Now;//sample
    
            // Add or Update List
              var foundit = TrackPrice.FirstOrDefault(x => x.ProgramPrice == loopLast);
                            if (foundit != null)// Found existing record
    
                            {
                                foundit.ProgramQuantity += loopLastQuantity;
                                foundit.ProgramLastTime = inputDateDT;
                            }
                            else // Add a new record
                            {
                                TrackPrice.Add(new PriceLevel
                                {
                                    ProgramPrice = loopLast,
                                    ProgramQuantity = loopLastQuantity,
                                    ProgramLastTime = inputDateDT,
    
                                });
                            }
                        }
        // Query the List
             var finalFourQuantities = (from a in TrackPrice
                                                   orderby a.ProgramQuantity descending
                                                   where a.ProgramQuantity > 300000
                                                   select new
                                                   {
                                                       a.ProgramPrice,
                                                       a.ProgramQuantity,
                                                       a.ProgramLastTime,
                                                   }).Take(4);
    
                        foreach (var myprice in finalFourQuantities)
                        {   
                            //Process 4 order prices
                        }               
    
            public class PriceLevel
        {
            public decimal ProgramPrice         { get; set; }
            public int ProgramQuantity          { get; set; }
            public DateTime ProgramLastTime     { get; set; }// Last Order Time
        }
    

1 个答案:

答案 0 :(得分:4)

您可以简单地在字典的Values属性上运行linq查询,将其视为任何其他IEnumerable<T>

关于解决方案的性能,您可以尝试将4个当前最高值自己存储在数组中,然后每当添加/更新值时,您只需要将新值与当前前4个进行比较,交换一个如果新值更大,则输出。这将消除对整个数据集进行线性搜索的需要。