代码之家  ›  专栏  ›  技术社区  ›  Ventus

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

  •  13
  • Ventus  · 技术社区  · 16 年前

    目前,我正在使用一个从 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 回复  |  直到 12 年前
        1
  •  25
  •   Jon Skeet    16 年前

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

    现在 SortedSet<T> IList<T> ,所以按索引访问 ElementAt 会很慢的。

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

        2
  •  9
  •   Bronek    13 年前

    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 
    
        3
  •  3
  •   Jon Hanna    16 年前

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

    如果你想在同一个对象上做几个操作,只要抓住那个对象就行了。

    如果您想在多个对象上执行某些操作,请在遍历它们(正常)的基础上执行 foreach 或者做什么 关于一个 Where() 等等)。如果你想在几个对象上做一些事情,然后在这些相同的对象上做一些其他的事情,你必须成批地做,而不是在同一个对象上做所有的操作 foreach公司 然后存储 其中() 在一个 List<T>