2017-05-19 45 views
-1

我在這裏想要實現一些方法,將接口引用列表轉換爲它們各自的類類型,然後返回列表在某種意義上是唯一的。創建通用方法

下面是這些方法

public bool ValidateDIPObject(DIP dip) 
    { 
     // Validating Tabels 
     IsFilesHavingUniqueID(dip.Files); 

     // Validating Files 
     IsTablesHavingUniqueID(dip.Tables); 

     // ... continues 
    } 

public bool IsFilesHavingUniqueID(List<IFile> files) 
    { 
     List<File> _files = files.ConvertAll(x => (File)x).ToList(); 
     return _files.Distinct().ToList().Count == _files.Count; 
    } 

    public bool IsTablesHavingUniqueID(List<ITable> tables) 
    { 
     List<Table> _tables = tables.ConvertAll(x => (Table)x).ToList(); 
     return _tables.Distinct().ToList().Count == tables.Count; 
    } 

通話是有,我可以在一個通用的方式編寫代碼的任何方法。我必須用相同的模式編寫一堆方法,所以我認爲通用代碼將是最好的選擇。

請幫

回答

0

你可以簡單地指定類型和接口的通用參數:

public bool IsTablesHavingUniqueID<TInterface, T>(List<TInterface> tables) 
     where T:TInterface 
{ 
    List<T> _tables = tables.ConvertAll(x => (T)x).ToList(); 
    return _tables.Distinct().ToList().Count == tables.Count; 
} 

此代碼假定類正確實施IEquatable<T>GetHashCode
Equals,如果不是 - 使用Distinct其他覆蓋拿比較者來說。

注意,代碼看起來像部分不正確執行OfType和可能的代碼可以重新寫爲:

tables.OfType<File>().Distinct().Count() == tables.Count(); 
+1

'tables.ConvertAll(X => (T)x)'應該是'表格。廣告()'。 – jmcilhinney

+0

@jmcilhinney爲什麼?代碼編譯爲OP具有'List'作爲輸入。我也不知道OP在找什麼。正如我注意到的,'OfType'更可能是他們所需要的,因爲他們似乎想要過濾特定類型的項目(並且'Cast'不太可能是正確的,因爲它只是簡單地改變類型,而不像'ConvertAll '是的) –

+0

它應該被施放,因爲正在進行演員陣容。要調用'ConvertAll'然後執行一次強制轉換肯定會奏效,但調用'Cast'會更好,因爲'Cast'是用於強制轉換的,也就是改變引用的類型,同時仍然引用同一個對象,'ConvertAll'用於轉換,即改變對象。 – jmcilhinney

2

你可以這樣做:

public bool IsUnique<IView,T>(List<IView> ls) where T : class 
{ 
    return ls.Cast<T>().Distinct().Count()==ls.Count(); 
}