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'語句的複雜性);加上加載數據的差異。模板方法是最好的方法還是我錯過了什麼?
我明白你的觀點:SOLID的S。但我仍然在自定義迭代器中重複自己。 :-( – ssg31415926
是的,但將類轉換爲迭代器會使代碼更少,因此更易於維護。所有迭代器都包含重複代碼。 – jgauffin