2012-12-28 35 views
0

我有不同的類準備匹配格式的結果:List對象是列表,其中對象是List。這是目標應用所必需的。如何將DRY應用於遍歷不同類的代碼迭代

源數據來自各種系統。這裏有一個:

var results = new List<object>(); 

using (var csvReader = new CsvReader(exportFilePath)) 
{ 
    csvReader.ValueSeparator = '$'; 
    var header = csvReader.ReadHeaderRecord(); 

    foreach (var record in csvReader.DataRecords) 
    { 
     var nameValuePairs = new List<object>(); 

     foreach (var column in header.Values) 
     { 
      var nameValuePair = new List<object>(2); 
      nameValuePair.Add(column); 
      nameValuePair.Add(record[column]); 

      nameValuePairs.Add(nameValuePair); 
     } 

     results.Add(nameValuePairs); 
    } 
} 

return results; 

這可能是最乾淨的形式。這是另一種:

var results = new List<object>(); 

var searchRootPath = "LDAP://OU=Standard Users Accounts,OU=...,DC=local"; 
var filter = "(&(objectClass=user)(objectCategory=person))"; 
var propertiesToLoad = new string[] { "sAMAccountName", "employeeNumber", 
    "mail", "telephoneNumber"}; 
using (var searchRoot = new DirectoryEntry(searchRootPath)) 
using (var ds = new DirectorySearcher(searchRoot, filter, propertiesToLoad, SearchScope.OneLevel)) 
{ 
    ds.PageSize = 100; 

    using (var src = ds.FindAll()) 
    { 
     foreach (SearchResult sr in src) 
     { 
      var propertyNameValuePairs = new List<object>(); 

      foreach (var property in propertiesToLoad) 
      { 
       var propertyNameValuePair = new List<object>(2); 
       propertyNameValuePair.Add(property); 
       if (sr.Properties[property].Count == 0) 
        propertyNameValuePair.Add("<not set>"); 
       else 
        propertyNameValuePair.Add(sr.Properties[property][0].ToString()); 

       propertyNameValuePairs.Add(propertyNameValuePair); 
      } 

      results.Add(propertyNameValuePairs); 
     } 
    } 
} 

return results; 

正如你所看到的,結構是重複的,但獲取數據的方式是不同的。在前者中,它是記錄[列],但後者是sr.Properties [property] [0] .ToString()(帶有整個'if'語句的複雜性);加上加載數據的差異。模板方法是最好的方法還是我錯過了什麼?

回答

2

提供返回一個Name/Value對象的自定義迭代器。

這樣就可以使用他們喜歡的:

UserCsvReader csvReader = new UserCsvReader(); 
while (csvReader.Read()) 
{ 
    users.Add(csvReader.Current.Name, csvReader.Current.Value); 
} 

這樣,你就得到類是隻負責提供數據。實際處理(在這種情況下將其添加到列表中)由調用者完成。

+0

我明白你的觀點:SOLID的S。但我仍然在自定義迭代器中重複自己。 :-( – ssg31415926

+0

是的,但將類轉換爲迭代器會使代碼更少,因此更易於維護。所有迭代器都包含重複代碼。 – jgauffin