foreach循环中对象的Filling List属性

西格德·博阿瑟特

我想知道是否可以比运行它时看到的更快地完成对象中的对象列表。我使用带有.ToList()的Dapper的简单查询来填充CABCodes-和CABDetails-list。

因此,这两个列表都在内存中,但是foreach操作大约需要20秒。

CAB代码:约10,000个对象

CAB细节:约60,000个对象

List<CABCode> CABCodes = new List<CABCode>();
List<CABDetail> CABDetails = new List<CABDetail>();

public class CABCode {
    public int Sequence { get; set; }
    public string Code { get; set; }
    public int Group { get; set; }
    public List<CABDetail> Details { get; set; }
}
public class CABDetail {
    public int CABSequence { get; set; }
    public int Proptype { get; set; }
    public string Propvalue { get; set; }
}

foreach (var c in this.CABCodes) {
    c.Details = this.CABDetails.Where(x => x.CABSequence == c.Sequence).ToList();
}

有没有更有效的方法来做到这一点?

乔治·波列沃(George Polevoy)

您有O(M * N)个算法时间。以下代码将其设置为O(M + N),这非常快:

var cabDetailsBySequence = CABDetails.ToLookup(d=>d.CABSequence);

foreach (var c in this.CABCodes) {
    c.Details = cabDetailsBySequence[c.Sequence].ToList();
}

更新:我检查过它在110毫秒内工作,具有100种不同的序列代码。

这是测试设置:

CABCodes = Enumerable.Range(0, 10000).Select(i=>new CABCode{Sequence = i%100}).ToList();
CABDetails = Enumerable.Range(0, 60000).Select(i=>new CABDetail{CABSequence = i%100}).ToList();

更新2:而且,如果您不介意在不同的CABCode实例中引用相同的列表,则可以使其速度更快(约为aprox的20倍),而如果并行执行则可以更快。这样,它可以在我的8核心系统上运行一毫秒:

var cabDetailListsBySequence = cabDetailsBySequence.ToDictionary(i=>i.Key, i=>i.ToList());

//  foreach (var c in this.CABCodes) {
//      c.Details = cabDetailListsBySequence[c.Sequence];
//  }   

this.CABCodes.AsParallel().ForAll(c=>c.Details = cabDetailListsBySequence[c.Sequence]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章