按照guid列表获取实体列表

时间:2016-08-18 14:10:27

标签: c# linq

我试图通过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的情况下,有没有很好的方法呢?

3 个答案:

答案 0 :(得分:3)

使用foreach还有一种很好的方法:

IEnumerable<Entity> GetEntitiesByGuids (EntityList entities, List<Guids> guids)
{
     foreach(var guid in guids) 
     {
         yield return Entities.Find(e=>e.Guid ==guid);
     }
}

答案 1 :(得分:3)

在性能方面,将列表与另一个列表进行过滤的最佳方法是使用散列集合,因为使用散列我们有快速查找(复杂度几乎为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");

结果:1​​9823ms

现在让我们介绍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();
}

结果:1​​1毫秒

答案 2 :(得分:2)

ServerAlias www.urologyexpert.mx urologoexpertomonterrey.mx www.urologoexpertomonterrey.mx