2016-08-18 86 views
2

我想通过它们的guid获得实体列表的实体的部分列表。通过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

性能方面对另一个列表过滤列表的最佳方法是使用哈希集合因为散列我们快速查找(即具有几乎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毫秒

+1

感谢这项技术!是否有任何关于框架集合的性能导向的概述可以建议? –

+1

那么,你可以阅读[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

+0

太酷了,谢谢你的详细解答。 – tal

2
List<Entity> GetEntitiesByGuids (List<Entity> entities, List<Guids> guids) 
{ 
    List<Entities> retVal = entities.Where(e => guids.Contains(e.Guid)).ToList(); 
    return retVal; 
} 
+1

这将返回的结果与问题 – Hogan

+1

不同的顺序要注意'实体。其中(e => ...'错字和'EntityList实体'而不是'列表实体' –

+0

谢谢@Vadim Levkovsky,修正。 – serhiyb

3

也有做它用foreach的一个很好的方式:

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

关于它特别“好”? – Maarten