2008-12-29 190 views
1

我在这个问题上看到LINQy way to check if any objects in a collection have the same property value有一个请求说如何使用LINQ来查看属性是否与集合匹配。但是,这是做这件事的最合理的过程吗?我将部署需要一定量资源管理的事物,并且我希望应用程序能够尽可能快速地响应,而不会使代码在其他人或我以后再回来时非常难以破译。检查一个集合中是否存在一个对象(T)

回答

2

然而,这是最快的合理的过程来做到这一点?

我猜的快捷方式(也许是最快的方法)来做到这一点可能是添加的所有对象到词典或HashSet的,使用属性作为主键字段:像HashSet的方法。添加有一个返回代码告诉你这个属性值是否已经被添加。例如:

static bool containsDuplicate(Container<Foo> fooCollection) 
{ 
    //create the hash set 
    HashSet<Bar> hashSet = new HashSet<Bar>(); 
    //for each object to be tested 
    foreach (Foo foo in fooCollection) 
    { 
     //get the interesting object property 
     Bar propertyValue = fooCollection.bar; 
     //see whather we've already seen this property value 
     if (!hashSet.Add(propertyValue)) 
     { 
      //duplicate detected 
      return true; 
     } 
    } 
    //no duplicate detected 
    return false; 
} 
1

LINQ几乎从来都不是最快的方式(根据原始执行时间)做任何事情。

虽然它通常“足够快”。当你有一个单元测试的工作应用程序,你可以分析它,看看你是否需要优化。

“我们应该忘记小效率,大约97%的时间:过早优化是万恶之源。” -Donald Knuth

0

确实,LINQ会正常工作。当然,如果您知道可以在特定情况下优化情况,那么您可以随时为更具体的类型编写自己的LINQ扩展方法。由于类型为更具特异性,因此应优先使用您自己的方法,而不是默认的Enumerable之一。这是不错的; -p

0

这实际上取决于您的收集数据量和执行此操作的频率。属性的Linq搜索必须读取集合中的每个项目/属性。

如果你的集合中只有10个物品,而且这个操作每秒只能执行一次,那么只有一次扫描才能找到物品属性的速度相当快。

如果您的集合中有1,000万个物品,那么只需转发或需要执行此类操作100次,那么您可能需要此属性的一些索引。

如果事实证明你需要索引这个,我会建议把这个逻辑封装在一个对象中。因此,例如添加一个Item将它添加到主集合中,并在一个散列集合中添加一个属性索引器。

相关问题