繁体   English   中英

按照guid列表获取实体列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM