我在这个问题上看到LINQy way to check if any objects in a collection have the same property value有一个请求说如何使用LINQ来查看属性是否与集合匹配。但是,这是做这件事的最合理的过程吗?我将部署需要一定量资源管理的事物,并且我希望应用程序能够尽可能快速地响应,而不会使代码在其他人或我以后再回来时非常难以破译。检查一个集合中是否存在一个对象(T)
1
A
回答
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将它添加到主集合中,并在一个散列集合中添加一个属性索引器。
相关问题
- 1. 判断一个对象是否存在于一个集合中
- 2. 可以检查一个集合或子集合是否存在?
- 3. ICollection - 检查一个集合是否包含对象
- 4. 检查是否是一个对象
- 5. 如何检查一个集合是否已经存在于ArangoDB
- 6. 如何检查一个GroupBox中是否存在对象 - VB.NET
- 7. 检查一个对象是否存在于JSON中
- 8. 检查一个对象是否为空
- 9. 如何检查一个对象是否存在于一个NSMutableArray中
- 10. in_array如何检查一个对象是否在一个对象数组中?
- 11. 检查一个集合是否至少包含一个文档
- 12. Laravel检查一个集合是否包含一个外键
- 13. 如何检查一个对象是否是一个字符串?
- 14. 如何检查对象是否在Domain对象的集合中?
- 15. node js,mongodb:检查一个对象是否已经存在
- 16. xcode检查一个NSArray是否存在并包含对象?
- 17. 检查一个对象是否是一个特定的类,并符合协议
- 18. 如何检查如果对象是一个集合
- 19. 检查一个值是否在与LINQ的集合中
- 20. 检查一个元素是否在jQuery集合中
- 21. 搜索一个列表来检查一个子对象是否已经存在
- 22. 检查对象是否已经存在集合 - Laravel
- 23. 检查一个对象是否是委托对象
- 24. 检查一个对象是否从一个类型继承
- 25. 检查一个对象是否属于一个通用类
- 26. 在创建之前检查Firestore中是否存在一个集合
- 27. 如何检查是否一个对象集合包含给定的顺序
- 28. JUnit:检查一个集合是否只包含某种类型的对象
- 29. 检查对象是在一个列表中比在另一个
- 30. 检查一个元素是否存在