我试图通过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
的情况下,有没有很好的方法呢?
答案 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");
结果: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毫秒
答案 2 :(得分:2)
ServerAlias www.urologyexpert.mx urologoexpertomonterrey.mx www.urologoexpertomonterrey.mx