C# 可以直接查字典吗?
我有一个在列表中使用自定义类(Price、Quantity、DateTime)的高速应用程序。如果找不到价格,我会将其添加到列表中,或者使用订单数量和日期时间更新它,然后在列表上运行查询,根据订单数量一次又一次地提取前4个匹配项。代码在前半个小时内运行良好,随后数千条记录陷入停滞。由于索引的原因,我想尝试使用字典,但无法理解update和Linq语句C# 可以直接查字典吗?,c#,dictionary,C#,Dictionary,我有一个在列表中使用自定义类(Price、Quantity、DateTime)的高速应用程序。如果找不到价格,我会将其添加到列表中,或者使用订单数量和日期时间更新它,然后在列表上运行查询,根据订单数量一次又一次地提取前4个匹配项。代码在前半个小时内运行良好,随后数千条记录陷入停滞。由于索引的原因,我想尝试使用字典,但无法理解update和Linq语句 是否可以直接Linq到字典中的字段(例如使用自定义类或结构)来提取前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
}
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个价格,并将它们吐出来。您可以为当前使用列表的操作添加代码吗?这样会更容易理解您的要求。现在这是一个聪明的方法。为什么我没有想到这一点呢?谢谢所有参与的人泰德也是!