2010-09-30 45 views
8

目前我使用的派生自HashSet的自定义类。有在代码中的一个点时,我选择在一定条件下的项目:从.NET HashSet的索引中选择一个元素

var c = clusters.Where(x => x.Label != null && x.Label.Equals(someLabel));

它工作正常,我得到的那些元素。但有没有一种方法可以在集合中使用ElementAt方法来获取该元素的索引,而不是整个对象?

它看起来或多或少是这样的:

var c = select element index in collection under certain condition; 
int index = c.ElementAt(0); //get first index 
clusters.ElementAt(index).RunObjectMthod();

手动遍历整个集合更好的办法?我需要补充的是它在一个更大的循环中,因此对于不同的someLabel字符串,此Where子句将执行多次。

编辑

我需要这个? clusters是一些文档集合的集合。文档通过主题相似性分组为聚类。因此算法的最后一步是发现每个群集的标签。但算法并不完美,有时它会使两个或更多个具有相同标签的群集。我想要做的只是将这些集群合并为一个大集合。

回答

14

集合通常不会索引。如果职位对你很重要,那么你应该使用List<T>而不是(或者可能还有)一套。

现在在.NET 4中的SortedSet<T>略有不同,因为它维护排序的值顺序。但是,它仍然没有执行IList<T>,所以按索引访问ElementAt会很慢。

如果您可以提供更多关于为什么要使用此功能的详细信息,这将有所帮助。你的用例目前还不是很清楚。

+0

我已经添加了问题的更详细的描述,因为你问:) – Ventus 2010-09-30 08:42:19

+0

@Ventus:这并不能解释你为什么需要索引。如果你只是想为每个匹配项目运行一个方法,一个简单的foreach循环肯定是前进的方向......你是否有一个特别的理由需要一个索引? – 2010-09-30 08:59:26

+0

显然我的语言能力(我的英文水平)并不完美,但我想在同一时间修改集合中的2个元素。然而,你使用'List'而不是set的建议是个好主意,所以问题解决了,你的答案被接受了。 – Ventus 2010-09-30 09:16:04

3

有没有这样的事情作为与散列集索引。在某些情况下,哈希集获得效率的方式之一就是不必维护它们。

我也没有看到这里有什么好处。如果您要获取索引,然后使用它,那么获取索引效率会比获取索引效率低(获得索引效率相同,然后再进行额外操作)。

如果您想对同一个对象执行多个操作,只需保持该对象。

如果你想要做的事在几个对象,这样做的通过他们的迭代(正常foreach或做在Where()等的结果foreach)的基础上。如果您想对多个对象执行某些操作,然后对这几个相同的对象执行其他操作,则必须在这些批处理中执行此操作,而不是执行同一个foreach中的所有操作,然后将Where()的结果存储在List<T>

5

如果您在HashSet中保存元素,有时您需要按索引获取元素,请考虑在这种情况下使用扩展方法ToList()。所以你使用HashSet的特性,然后利用索引。

HashSet<T> hashset = new HashSet<T>(); 

//the special situation where we need index way of getting elements 
List<T> list = hashset.ToList(); 

//doing our special job, for example mapping the elements to EF entities collection (that was my case) 

//we can still operate on hashset for example when we still want to keep uniqueness through the elements 
+1

这是否安全?我认为,当你向HashSet添加元素时,这些项目可能会被重新排序,随后对ToList()的调用可能不会总是产生相同的顺序。这只是一个预感,我没有看过代码,MSDN也没有透露太多。 – uriDium 2015-09-29 12:14:09

+0

@uriDium定义“安全”。重点不在于后续的调用保持相同的顺序,而仅仅是为了执行一些对象的功能。 – Wolfzoon 2016-08-08 21:33:25