当SecurityInfoMasterList包含约11,000个项目,而listClassiNode包含约750个项目时,下面的语句大约需要6秒钟才能产生输出。

还有其他方法可以达到相同的结果,但性能更好吗?

List<SecurityInfo> listSecurityInfo = SecurityInfoMasterList.Where(c =>
    listClassiNode.Any(d =>
        c.SX == d.Exch && c.Instrument == d.Instrument)).ToList();


我一直在尝试使用for循环,但是并没有看到太大的改进。

更新:

listClassiNode是一个列表

[Serializable]
     public class SecurityInfo
    {
    public string SecurityID { get; set; }
    public int SecurityTypeID { get; set; }
    public string Code { get; set; }
    public string SecurityName { get; set; }
    public int DB { get; set; }
    public string ExchangeName { get; set; }
    public DateTime FirstDate { get; set; }
    public int StatusCode { get; set; }
    public long GICS { get; set; }
    public string ICB { get; set; }
    public string Sector { get; set; }
    public string IndustryGroup { get; set; }
    public string Industry { get; set; }
    public string Instrument { get; set; }
    public string TypeDescription { get; set; }
    public string SX { get; set; }
    public string GUID { get; set; }
  }



[Serializable()]
    public class ClassificationNode
    {
        public string Exch { get; set; }
        public string Instrument { get; set; }
        public string Prefix { get; set; }
        public string Name { get; set; }
        public string Level { get; set; }
    }


艾伦

最佳答案

您可以将listClassiNode转换为某种HashSet,以便查找是O(1)而不是O(n)

var hash = new HashSet<string>(
    listClassiNode.Select(t =>
        string.Format("{0}_{1}", t.Exch, t.Instrument)).Distinct());

List<SecurityInfo> listSecurityInfo = SecurityInfoMasterList.Where(c =>
    hash.Contains(string.Format("{0}_{1}", c.SX, c.Instrument))
        .ToList();


上面有些笨拙,string.Format创建了一个用于HashSet的级联密钥。希望您的数据的性质不会造成问题。无论如何,我希望您能想到。

09-27 15:07