我发现在这个问题上 LINQy way to check if any objects in a collection have the same property value 上有一个请求,要求使用LINQ来检查集合中的属性是否匹配。然而,这是否是最快的合理方法来做此事?我将部署一些需要一定数量的资源管理的东西,我希望应用程序能够尽可能地响应,而不会使代码在其他人或我自己稍后回来时变得极难理解。
检查集合中(T类型的)对象的存在
原标题:
最佳回答
然而,这是最快速合理的过程吗?
我猜快速的方法(也许是最快的方法)是将所有对象添加到字典或哈希集中,使用该属性作为键字段:像HashSet.Add这样的方法具有返回代码,告诉您是否已经添加了此属性值。例如:
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;
}
问题回答
LINQ 幾乎從不是以原始執行時間為標準的最快方式。
通常情况下,“足够快”。当您有一个带有单元测试的工作应用时,可以对其进行剖析以查看是否需要优化。
我们应该忘记小的效率,大约 97% 的时间:过早优化是万恶之源。 -唐纳德·库特
实际上,LINQ 可以很好地工作。当然,如果您知道在特定情况下可以优化情况,您可以始终为更具体的类型编写自己的 LINQ 扩展方法。由于该类型更具体,应优先使用您自己的方法而不是默认的 Enumerable。这很好;-p
这取决于您的集合中的数据量和执行此操作的频率。按属性进行Linq搜索将不得不阅读集合中的每个项目/属性。
如果你的收藏只有10个物品,并且这个操作每秒只执行一次,那么按属性进行的仅向前扫描很可能足够快速。
如果您的收藏品有1000萬件物品,那麼如果需要每秒進行100次操作,那麼您可能需要對此屬性進行一些索引。
如果您需要索引此内容,我建议将此逻辑封装在一个对象中。例如,添加一个项目将其添加到主要集合中,并在某种哈希集合中添加一个属性索引器。
相关问题
热门标签
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding