当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的级联密钥。希望您的数据的性质不会造成问题。无论如何,我希望您能想到。