从.NET HashSet中按索引选择元素

时间:2010-09-30 08:29:52

标签: c# .net hashset

目前我正在使用从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();

手动迭代整个集合的方式更好吗?我需要补充说它是一个更大的循环,因此对于不同的Where字符串,这个someLabel子句会执行多次。

修改

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

3 个答案:

答案 0 :(得分:22)

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

现在,.NET 4中的SortedSet<T>略有不同,因为它维护着一个排序的值顺序。但是,它仍然没有实现IList<T>,因此使用ElementAt的索引访问速度会变慢。

如果您可以提供有关您希望此功能的更多详细信息,那么它会有所帮助。你的用例目前还不是很清楚。

答案 1 :(得分:8)

如果您在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 

答案 2 :(得分:3)

没有带散列集的索引。散列集在某些情况下提高效率的方法之一是不必维护它们。

我也看不出这里有什么优势。如果你要获得索引,然后使用它,这将比获取元素效率低(获得索引同样有效,然后你需要额外的操作)。

如果要对同一个对象执行多个操作,只需按住该对象即可。

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