我有两个大的对象列表.首先(大约1 000 000个物体):
public class BaseItem
{
public BaseItem()
{
}
public double Fee { get; set; } = 0;
public string Market { get; set; } = string.Empty;
public string Traider { get; set; } = string.Empty;
public DateTime DateUtc { get; set; } = new DateTime();
}
Run Code Online (Sandbox Code Playgroud)
第二(约2万件物品):
public class TraiderItem
{
public TraiderItem()
{
}
public DateTime DateUtc { get; set; } = new DateTime();
public string Market { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty;
public double Price { get; set; } = 0;
public double Amount { get; set; } = 0;
public double Total { get; set; } = 0;
public double Fee { get; set; } = 0;
public string FeeCoin { get; set; } = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)
当等于且等于时,我需要找到Traider项目中的所有项目.现在我使用Any方法:BaseDateUtc Fee
traiderItemsInBase = traiderItems.Where(a => baseItems.Any(x => x.DateUtc == a.DateUtc && Math.Round(x.Fee, 8) == Math.Round((double)a.Fee * 0.4, 8))).ToList();
Run Code Online (Sandbox Code Playgroud)
但这种方式非常慢.有没有办法提高效率?在这种情况下是否有可能使用HashSet?
首先,我虽然有解决方案Hashet<>或Dictionary<>但这并没有真正融入这个用例.如何通过PLINQ使用更多的内核/线程来加快速度AsParallel()?
traiderItemsInBase = traiderItems.AsParallel()
.Where(a => baseItems.Any(x => x.DateUtc == a.DateUtc &&
Math.Round(x.Fee, 8) == Math.Round((double)a.Fee * 0.4, 8)))
.ToList();
Run Code Online (Sandbox Code Playgroud)
这应该可以很好地扩展,因为这些操作发生在您的内存中,而不是查询数据库或其他瓶颈.所以4核应该解决这个问题几乎快4倍.
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |