2013-07-09 48 views
-1

爲了讓我的生活更輕鬆地處理字符串,我想使用用StringComparer.OrdinalIgnoreCase初始化的hashset。什麼會使這個HashSet實現失敗?

但有時候,我需要對所有項目進行操作。

這顯然不是我明顯的性能原因實現我的目標的方式,但我想知道這段代碼是否有意義,特別是索引的「Set」部分,以及它如何引起不想要的副作用。

下面是HashSet的實現:

public class MyHashSet<T> : HashSet<T> 
{ 
    public T this[int index] 
    { 
     get 
     { 
      int i = 0; 
      foreach (T t in this) 
      { 
       if (i == index) 
        return t; 
       i++; 
      } 
      throw new IndexOutOfRangeException(); 
     } 
     set 
     { 
      int i = 0; 
      foreach (T t in this) 
      { 
       if (i == index) 
       { 
        this.RemoveWhere(element => element.Equals(t)); 
        this.Add(value); 
        return; 
       } 
       i++; 
      } 
      throw new IndexOutOfRangeException(); 
     } 
    } 

    public MyHashSet() 
    { 

    } 

    public MyHashSet(IEnumerable<T> collection) 
     : base(collection) 
    { 

    } 
    public MyHashSet(IEnumerable<T> collection, IEqualityComparer<T> comparer) 
     : base(collection, comparer) 
    { 

    } 
    public MyHashSet(IEqualityComparer<T> comparer) 
     : base(comparer) 
    { 

    } 
} 

在什麼樣的條件是不是安全的?

+0

爲什麼要在HashSet上使用整數索引器? –

+5

在沒有隱式順序的集合上使用索引是毫無意義和愚蠢的。您所看到的任何有利結果都是具體實施,主要是巧合。 – spender

+0

你的'RemoveWhere'實現是什麼? – Servy

回答

1

在什麼情況下不安全?

任何。您嘗試按索引訪問HashSet中的項目,但它們沒有邏輯索引。它們迭代的順序是任意的,不能依賴,所以在任何情況下,這個方法在概念層面都是沒有意義的。

如果您希望能夠按索引訪問項目,請使用訂購的集合,例如List