【问题标题】:Is it possible to Linq Directly to a Dictionary?是否可以直接 Linq 到字典?
【发布时间】:2015-12-13 01:31:35
【问题描述】:

我有一个高速应用程序,在列表中使用自定义类(价格、数量、日期时间)。如果没有找到价格,我要么添加到列表中,要么使用 Order Qty 和 DateTime 更新它,然后在列表中运行查询以一次又一次地按订单数量提取前 4 次出现。该代码在前半小时运行良好,然后在数千条记录之后陷入困境。由于索引的原因,我考虑过尝试字典,但无法弄清楚更新和 Linq 语句。

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

  2. 我能否在使用更新的 Order Qty 和 DateTime 从 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
    }

【问题讨论】:

  • 请说明操作、参数和作用。例如,您所说的“未找到价格”是什么意思 - 您是按价格搜索吗?还有“按订单数量排名最高的事件” - 数量较多的商品?等等。
  • 我明白了,您正在按价格搜索,如果有该价格的订单,那么您会以该价格获取前 4 个订单(我想是按数量)?
  • 要回答问题的标题,您可以使用 LINQ 在字典中进行搜索。我认为更大的问题是您应该,或者您应该如何真正构建数据以进行有效查询。
  • 现在我在列表中搜索订单价格,如果没有找到,我添加订单价格、订单数量和日期时间。如果我找到订单价格,我只需更新订单数量和日期时间。每隔一秒我就会查询List,找出订单量最大的4个价格并吐出来
  • 您可以在当前使用列表的操作中添加代码吗?这样就更容易理解您的要求了。

标签: c# dictionary


【解决方案1】:

您可以简单地对字典的 Values 属性运行 linq 查询,将其视为任何其他 IEnumerable&lt;T&gt;

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

【讨论】:

  • 现在这是一个聪明的方法。我怎么没想到呢 谢谢大家也贡献了!
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2020-09-20
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多