2010-09-30 87 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

相關問題