2015-11-27 49 views
0

我不知道我是怎樣,但幾個星期現在用的是HashSet<myObject>收集主要字符串成員,因爲我真的,雖然它的內部採用的是內置的方法,因爲字典,以避免重複在數據的非KVP格式項目(單柱)遍歷字符串建設一個獨特鮮明收集的數據對象

我的方案是:

HashSet<myHddFolderPaths> UniqColleciton = new HashSet<myHddFolderPtahs> 
int countRounds=0; 
void addToCollection() 
{ 

    for(int i=0, i < UniqColleciton.Count; i++) 
    { 
     add some items to UniqColleciton via Directory.GetDirectories(); 
    } 
    if(countRounds++ < Limit) 
     addToCollection() 
} 

這對於DIR-步行者的模式我建立,這是一個場景時的遞歸只是一個例子相同的數據無法避免,所以我不記得我在哪裏讀過它,並認爲,通過簡單地使用HashSet<T>會「只是照顧生意」

我沒有想到它會允許重複的選項,但在這個項目中,我把它放到一個測試,這確實讓我吃驚添加現有項目 所以我解決辦法是:

Dictionary<string, int> fiterAccesDeniedPaths = new Dictionary<string, int>(); 
Dictionary<string, int> fiterAccesiblePaths = new Dictionary<string, int>(); 

if (this.fiterAccesDeniedPaths.ContainsKey(e.Message)) continue; 
if (this.fiterAccessiblePaths.ContainsKey(object.stringPathMember)) continue; 
add to filters ; UniqColleciton.Add(myHddFolderPaths); 

是有acomplishing這項任務更好/更有效的方法?

public class FolderPath 
{ 
    public string DriveL { get; set; } 
    public string FolderLevel { get; set; } 
    public string Path { get; set; } 
    public int Fsize { get; set; } 
} 


    public class GenericUniqCollectionM<T> : HashSet<T> 
    { 
     public GenericUniqCollectionM():base() 
     { 

     } 
    } 
+0

什麼是myHddFolderPaths?我想你自己的班級可以發佈代碼嗎? –

+0

@IvanStoev肯定給我一分鐘。 –

+0

@IvanStoev是否需要在我的對象或集合上實現它,現在我將爲'MyUniqCollection ' –

回答

1

與參數的構造函數創建一個HashSet使用默認的相等比較。 default comparer將使用FolderPath.Equals()來檢查相等性。

internal class ObjectEqualityComparer<T> : EqualityComparer<T> 
{ 
    public override bool Equals(T x, T y) 
    { 
     if (x != null) 
     { 
      if (y != null) return x.Equals(y); 
      return false; 
     } 
     if (y != null) return false; 
     return true; 
    } 

    public override int GetHashCode(T obj) 
    { 
     if (obj == null) return 0; 
     return obj.GetHashCode(); 
    } 

    ... 
} 

你沒有覆蓋EqualsGetHashCode,所以它會使用由object提供的默認實現,檢查參考平等。

現在你有兩個選擇。一是覆蓋FolderPathEqualsGetHashCode

public class FolderPath 
{ 
    ... 

    public override bool Equals(object obj) 
    { 
     if (obj == null) return false; 

     FolderPath other = obj as FolderPath; 
     if (other == null) return false; 

     //simple implementation, only compares Path 
     return Path == other.Path; 
    } 

    public override int GetHashCode() 
    { 
     if (Path == null) return 0; 
     return Path.GetHashCode(); 
    } 
} 

另一種是實現一個自定義IEqualityComparer<FolderPath>

public class FolderPathComparer : IEqualityComparer<FolderPath> 
{ 
    public bool Equals(FolderPath x, FolderPath y) 
    { 
     if (x != null) 
     { 
      if (y != null) return x.Path == y.Path; 
      return false; 
     } 
     if (y != null) return false; 
     return true; 
    } 

    public int GetHashCode(FolderPath obj) 
    { 
     if (obj == null || obj.Path == null) return 0; 
     return obj.Path.GetHashCode(); 
    } 
} 

,並把它傳遞給HashSet構造。

var set = new HashSet<FolderPath>(new FolderPathComparer()); 
+0

我已經對我的問題進行了編輯,您能否將'GenericUniqCollectionM'上的代碼的重要部分作爲示例實現? –

+0

所以現在在這個實現,如果我添加到我的任何類>'MycustomObject:ObjectEqualityComparer'這應該做的工作? –

+0

我太忙了,我忘了謝謝你,它真的解決了我的方法,使用詞典過濾器的方式。非常感謝Lortz先生 –