C# 从.NET哈希集中按索引选择元素

C# 从.NET哈希集中按索引选择元素,c#,.net,hashset,C#,.net,Hashset,目前,我正在使用一个从HashSet派生的自定义类。当我在特定条件下选择项目时,代码中有一点: var c = clusters.Where(x => x.Label != null && x.Label.Equals(someLabel)); 它工作得很好,我得到了这些元素。但是有没有一种方法可以让我在集合中接收该元素的索引,以便与ElementAt方法一起使用,而不是整个对象 它看起来或多或少是这样的: var c = select element index in collection u

目前,我正在使用一个从
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
字符串执行多次

编辑

我需要这个做什么<代码>簇是一些文档集合的一组簇。文档按主题相似性分组。因此,算法的最后一步是为每个集群发现标签。但该算法并不完美,有时会使两个或多个簇具有相同的标签。我想做的只是将这些集群合并成一个大集群。

集合通常没有索引。如果职位对您很重要,您应该使用
列表
,而不是(或可能同时使用)集合

现在在.NET4中略有不同,因为它保持了排序的值顺序。但是,它仍然没有实现
IList
,因此使用
ElementAt
通过索引进行访问将会很慢


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

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

我也不知道这里有什么优势。如果您要获取索引,然后使用它,这将比仅获取元素的效率要低(获取索引的效率同样高,然后您需要进行额外的操作)

如果要对同一对象执行多个操作,请按住该对象


如果要在多个对象上执行某些操作,请在迭代它们的基础上执行(正常
foreach
或对
Where()
的结果执行
foreach
)。如果要在多个对象上执行某项操作,然后在这些相同的对象上执行其他操作,并且必须成批执行,而不是在同一个
foreach
中执行所有操作,则存储
Where()的结果<代码>列表> <代码> 

在HasSeT中包含元素,有时需要按索引获取元素时,请考虑在这种情况下使用扩展方法Tristor()。因此,您可以使用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 
HashSet HashSet=newhashset();
//我们需要索引方式获取元素的特殊情况
List=hashset.ToList();
//执行我们的特殊工作,例如将元素映射到EF entities集合(这是我的案例)
//例如,当我们仍然希望保持元素的唯一性时,我们仍然可以对hashset进行操作

我已经按照您的要求添加了一个问题的更详细描述:)@Ventus:这并不能真正解释您为什么需要索引。如果您只想为每个匹配项运行一个方法,那么简单的foreach循环肯定是前进的方向。。。你想要索引有什么特别的原因吗?显然我的语言技能(我是说英语)并不完美,尽管我想同时修改集合中的两个元素。然而,你建议使用
列表
而不是set是个好主意,所以问题解决了,你的答案也被接受了。你说“如果位置对你很重要,你应该使用
列表
”,但如果我想在我的收藏和顺序中使用唯一的条目呢?@whiteshooz:然后保留
哈希集
列表
,并保持同步。我不相信BCL中有任何保证保持位置的集合实现。这安全吗?我认为,当您向HashSet添加元素时,这些项可能会被重新排序,随后对ToList()的调用可能并不总是产生相同的顺序。这只是一种预感,我还没有看过代码,MSDN也没有透露太多。@uriDium Define“safe”。关键不在于后续调用保持相同的顺序,而只是为了使用某些对象执行函数。