可以直接使用Linq查询字典吗?

3
我有一个高速应用程序,使用一个自定义类(Price、Quantity、DateTime)作为List的元素。如果Price没有找到,我会将其添加到List中,否则使用Order Qty和DateTime更新它,然后在List上运行查询以提取按Order Quantity排序的前4个出现次数。代码在半小时内表现良好,但在处理数千条记录后变得缓慢。考虑尝试使用字典,因为它具有索引功能,但无法理解如何更新和使用Linq语句。
以下是需要回答的问题:
  1. 是否可以直接使用自定义类或结构体在字典中进行Linq操作,提取前4个出现次数?如果可以,提供一个简短的示例。
  2. 如果从TryGetValue执行后,可以直接更新字典字段中的值吗?如果可以,提供一个简短的示例。
  3. ...还是说不应该使用字典,记住速度至关重要?
感谢任何帮助。
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
    }

请澄清操作、它们的参数以及它们的作用。例如,“Price is not found”是指通过价格进行搜索吗?还有,“top occurrences, by order quantity”是指数量较高的物品吗?等等。 - Ivan Stoev
只是为了我理解,您是按价格搜索,如果有该价格的订单,那么您会选择该价格的前4个订单(我猜是按数量)? - David Hoerster
1
回答你的问题标题,你可以使用 LINQ 在字典中搜索。我认为更重要的问题是你应该吗?或者你应该如何真正构建高效查询的数据结构。 - David Hoerster
现在在列表中,我搜索订单价格,如果没有找到,我就添加订单价格、订单数量和日期时间。如果我找到了订单价格,我只需更新订单数量和日期时间。每秒钟我查询一次列表,以查找具有最大订单数量的4个价格,并将它们输出。 - Greg
你能否在使用列表的当前操作中添加代码吗?这样更容易理解您的要求。 - PiotrWolkowski
你可以将字典键设置为“价格”,然后将该价格的订单列表作为字典值。不过,我不确定负载和内存存储库刷新的频率。 - David Hoerster
1个回答

4
你可以直接在字典的Values属性上运行linq查询,将其视为任何其他的IEnumerable<T>。
关于你的解决方案的性能,你可以尝试将当前的4个顶部值单独存储在一个数组中,然后每当添加/更新一个值时,只需要将新值与当前的前4个值进行比较,如果新值更大,则交换其中一个。这将消除对整个数据集的线性搜索的需求。

现在这是一个聪明的方法。为什么我没想到呢?感谢所有做出贡献的人! - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接