我在这个问题LINQy way to check if any objects in a collection have the same property value上看到了这个问题,请求说明如何使用LINQ来查看属性是否与集合匹配。但是,这是最快的合理过程吗?我将部署需要一定量资源管理的东西,并且我希望应用程序能够尽可能地响应,而不会使代码非常难以在其他人或我自己以后再回到它时进行解密。
答案 0 :(得分:2)
然而,这是否是执行此操作的最快合理流程?
我猜这样做的一种快速方式(也许是最快的方法)可能是将所有对象添加到Dictionary或HashSet中,使用属性作为关键字段:像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;
}
答案 1 :(得分:1)
LINQ几乎绝不是最快的方式(就原始执行时间而言)。
但通常“足够快”。当您有一个带有单元测试的工作应用程序时,您可以对其进行分析以查看是否需要进行优化。
“我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。” -Donald Knuth
答案 2 :(得分:0)
确实,LINQ可以正常工作。当然,如果您知道可以优化给定情况下的情况,则可以始终为更具体的类型编写自己的LINQ扩展方法。由于类型 更具特色,因此应优先使用您自己的方法,而不是默认的Enumerable
方法。这很好;-p
答案 3 :(得分:0)
这实际上取决于集合中的数据量以及执行此操作的频率。 Linq搜索属性必须读取集合中的每个项目/属性。
如果您的收藏中只有10个项目并且此操作仅每秒执行一次,那么仅向前扫描以查找属性的项目很可能足够快。
如果你的收藏品中有1000万件物品,那么只需要前进或者需要100次执行此类操作,那么你可能需要一些关于此属性的索引。
如果结果你需要索引这个我建议将这个逻辑封装在一个对象中。因此,例如添加一个Item会将它添加到主集合中,并在一个散列集中添加一个属性索引器。