目前我正在使用从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
是一组文档集合的集合。文档按主题相似性分组。因此,该算法的最后一步是发现每个群集的标签。但算法并不完美,有时它会产生两个或多个具有相同标签的聚类。我想要做的只是将这些集群合并为一个集群。
答案 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>
。