性能方面对另一个列表过滤列表的最佳方法是使用哈希集合因为散列我们快速查找(即具有几乎O(1)复杂性)
首先,让我们测量时间,需要通过使用散列的正常List<Guid>
:
public static List<Entity> GetEntitiesByGuids(List<Entity> entities, List<Guid> guids)
{
return entities?.Where(e => guids.Contains(e.Guid)).ToList();
}
而且Main()
方法,在这两种情况是:
var entities = new List<Entity>();
var guids = new List<Guid>();
for (int i = 0; i < 100000; i++) guids.Add(Guid.NewGuid());
for (int i = 0; i < 100000; i++) entities.Add(new Entity() {Guid = guids[i]});
var guidsToFilter = guids.Skip(12000).Take(40000).ToList();
Console.WriteLine("Started to filter list");
var s = new Stopwatch(); s.Start();
var result = GetEntitiesByGuids(entities, guidsToFilter);
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds+"ms");
结果:19823ms
现在介绍HashSet<T>
集合:
public static List<Entity> GetEntitiesByGuids(List<Entity> entities, List<Guid> guids)
{
var hashedGuids = new HashSet<Guid>(guids);
return entities?.Where(e => hashedGuids.Contains(e.Guid)).ToList();
}
结果:11毫秒
感谢这项技术!是否有任何关于框架集合的性能导向的概述可以建议? –
那么,你可以阅读[this](http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx)和[this] (http://cc.davelozinski.com/c-sharp/fastest-collection-for-string-lookups)文章,如果你有兴趣。这只是前两个在谷歌搜索显示,所以有关于此事的很多好东西。 – Fabjan
太酷了,谢谢你的详细解答。 – tal