[英]Get a list of entities by list of guids
我试图通过guid获取实体列表的部分实体列表。
可以完成:
List<Entity> GetEntitiesByGuids (List<Entity> entities, List<Guids> guids)
{
List<Entities> retVal = new List<Entities>();
foreach(var guid in guids)
{
var Entity = Entities.Find(e=>e.Guid ==guid)
retVal.Add(Entity);
}
return retVal;
}
没有foreach
有什么好办法吗?
使用foreach还有一种很好的方法:
IEnumerable<Entity> GetEntitiesByGuids (EntityList entities, List<Guids> guids)
{
foreach(var guid in guids)
{
yield return Entities.Find(e=>e.Guid ==guid);
}
}
性能方面,将列表与另一个列表进行过滤的最佳方法是使用散列集合,因为使用散列我们有快速查找(复杂度几乎为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();
}
结果:11ms
List<Entity> GetEntitiesByGuids (List<Entity> entities, List<Guids> guids)
{
List<Entities> retVal = entities.Where(e => guids.Contains(e.Guid)).ToList();
return retVal;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.