0

一致する形式で結果を準備するさまざまなクラスがあります。オブジェクトがリストであるリストオブジェクトがリストであるリスト。これは、ターゲットアプリで必要です。

ソースデータはさまざまなシステムから取得されます。これが1つです:

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;

ご覧のとおり、構造は繰り返されていますが、データの取得方法が異なります。たとえば、前者の場合はrecord [column]ですが、後者の場合はsr.Properties [property] [0] .ToString()です('if'ステートメント全体が複雑になります)。加えて、データのロードの違い。テンプレートメソッドは最善のアプローチですか、それとも何かが足りませんか?

4

1 に答える 1

2

Name/Valueオブジェクトを返すカスタムイテレータを提供します。

あなたがそれらを次のように使うことができるように:

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

このようにして、データの提供のみを担当するクラスを取得します。実際の処理(この場合はリストに追加)は、呼び出し元によって実行されます。

于 2012-12-28T08:47:32.217 に答える