C# 可以直接查字典吗?

C# 可以直接查字典吗?,c#,dictionary,C#,Dictionary,我有一个在列表中使用自定义类(Price、Quantity、DateTime)的高速应用程序。如果找不到价格,我会将其添加到列表中,或者使用订单数量和日期时间更新它,然后在列表上运行查询,根据订单数量一次又一次地提取前4个匹配项。代码在前半个小时内运行良好,随后数千条记录陷入停滞。由于索引的原因,我想尝试使用字典,但无法理解update和Linq语句 是否可以直接Linq到字典中的字段(例如使用自定义类或结构)来提取前4个匹配项?如果是这样的话,举个简单的例子就好了 我可以在使用更新的订单数量和

我有一个在列表中使用自定义类(Price、Quantity、DateTime)的高速应用程序。如果找不到价格,我会将其添加到列表中,或者使用订单数量和日期时间更新它,然后在列表上运行查询,根据订单数量一次又一次地提取前4个匹配项。代码在前半个小时内运行良好,随后数千条记录陷入停滞。由于索引的原因,我想尝试使用字典,但无法理解update和Linq语句

  • 是否可以直接Linq到字典中的字段(例如使用自定义类或结构)来提取前4个匹配项?如果是这样的话,举个简单的例子就好了

  • 我可以在使用更新的订单数量和日期时间从TryGetValue执行后直接更新字典字段吗? 如果是这样的话,举个简单的例子就好了

  • …还是说词典不是前进的方式,记住速度才是关键

  • 感谢您的帮助

    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
        }
    
    List TrackPrice=新列表();
    十进制循环last=0//仅样品
    int loopLastQuantity=0//仅样品
    DateTime inputDateDT=DateTime.Now//样品
    //添加或更新列表
    var foundit=TrackPrice.FirstOrDefault(x=>x.ProgramPrice==loopLast);
    if(foundit!=null)//找到现有记录
    {
    foundit.ProgramQuantity+=loopLastQuantity;
    foundit.ProgramLastTime=inputDateDT;
    }
    else//添加新记录
    {
    TrackPrice.Add(新的价格级别)
    {
    ProgramPrice=loopLast,
    ProgramQuantity=loopLastQuantity,
    ProgramLastTime=inputDateDT,
    });
    }
    }
    //查询列表
    var FinalFourQuantilities=(来自跟踪价格中的a)
    orderby a.ProgramQuantity降序
    其中a.程序数量>300000
    选择新的
    {
    a、 节目价格,
    a、 节目数量,
    a、 上次,
    }).采取(4);
    foreach(var myprice,最终四个数量)
    {   
    //处理4订单价格
    }               
    公共类价格水平
    {
    公共十进制程序价格{get;set;}
    公共int程序数量{get;set;}
    公共日期时间程序LastTime{get;set;}//上次订单时间
    }
    
    您只需在字典的Values属性上运行linq查询,将其视为任何其他
    IEnumerable


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

    请澄清操作、参数及其作用。例如,你所说的“未找到价格”是什么意思?你是按价格搜索的吗?还有“最常见的,按订单数量搜索的”-数量较高的项目?等等。据我所知,你是按价格搜索的,如果有价格相同的订单,那么你就接受前4个订单(我想是按数量搜索的)对于该价格?要回答问题的标题,您可以使用LINQ在字典中搜索。我认为更大的问题是您是否应该,或者您应该如何真正构造数据以实现高效查询。现在在列表中,我搜索订单价格,如果未找到,我添加订单价格、订单数量和日期时间。如果我找到订单价格,我只需更新订单数量和日期时间。每隔一秒钟,我都会查询列表,找到订单数量最大的4个价格,并将它们吐出来。您可以为当前使用列表的操作添加代码吗?这样会更容易理解您的要求。现在这是一个聪明的方法。为什么我没有想到这一点呢?谢谢所有参与的人泰德也是!