我在List中使用自定义类(Price,Quantity,DateTime)进行高速应用。我要么添加到列表中,如果找不到价格,要么使用订单数量和日期时间更新它,然后在列表上运行查询以按顺序数量一遍又一遍地提取前4个事件。该代码在前半个小时运行良好,之后成千上万条记录陷入困境。我想过尝试一本字典,因为索引,但无法弄清楚更新和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
}
答案 0 :(得分:4)
您可以简单地在字典的Values属性上运行linq查询,将其视为任何其他IEnumerable<T>
关于解决方案的性能,您可以尝试将4个当前最高值自己存储在数组中,然后每当添加/更新值时,您只需要将新值与当前前4个进行比较,交换一个如果新值更大,则输出。这将消除对整个数据集进行线性搜索的需要。