1

私はこれをコード内のいくつかの異なる場所に書き込んでおり、単一のジェネリック関数を作成したいのですが、その方法を完全に理解することはできません。

これが私がしていることの例です:

public static string FormatCompaniesAsCSV(ICollection<Company> companies)
{
    string csv = "";
    foreach(Company c in companies)
    {
        csv += c.CompanyName + ",";
    }

    return csv.Substring(0, csv.LastIndexOf(","));
}

問題は、すべての会社のSKUまたはこれが製造されているすべての工場を表示する場合、基本的に同じコードを記述しなければならないことです。変更されるのは、アクセスしているオブジェクトタイプとプロパティだけです。私がやりたいのは次のようなものです。

public static string FormatCSV<T>(ICollection<T> elements, string propertyName)
{
    string csv = "";
    foreach(T element in elements)
    {
        //I know this next line doesn't work
        //this is just a high level conceptualization of what I want to do
        csv += element.getPropertyValue(propertyName) + ","; 
    }

    return csv.Substring(0, csv.LastIndexOf(","));
}

foreachループ内の要素のプロパティにアクセスする方法が必要ですが、どこから始めればよいのかよくわかりません。System.Linq.Expressionsライブラリを簡単に調べましたが、探していたものが見つかりませんでした。

私は正しい方向に進んでいますか?そうでない場合、私がやりたいことを達成するためのより良い方法はありますか?

4

2 に答える 2

4

代理人を渡すことをお勧めします。

public static string FormatAsCSV<T>(IEnumerable<T> elements,
                                    Func<T, string> converter) 
{ 
    string csv = ""; 
    foreach(T element in elements) 
    { 
        csv += converter(element) + ","; 
    } 

    return csv.Substring(0, csv.LastIndexOf(",")); 
} 

このメソッドは次のように呼び出すことができます。

FormatAsCsv(companies, x => x.CompanyName);
FormatAsCsv(factories, x => x.ZipCode + " " + x.City);

this最初のパラメータのタイプの前に追加することで、それから拡張メソッドを作成することもできます。

public static string FormatAsCSV<T>(this IEnumerable<T> elements,
                                    Func<T, string> converter) 

今、あなたはそれをこのように呼ぶことができます:

companies.FormatAsCsv(x => x.CompanyName);
factories.FormatAsCsv(x => x.ZipCode + " " + x.City);

ところで:の機能のみを使用しているので、タイプをからICollection<T>に変更しました。IEnumerable<T>IEnumerable<T>

また、CSV文字列の生成を改善できます。

public static string FormatAsCSV<T>(this IEnumerable<T> elements,
                                        Func<T, string> converter) 
{
    return elements.Select(x => converter(x)).Aggregate((x, y) => x + "," + y);
}
于 2012-08-15T13:16:23.663 に答える
0

カンマとの連結は1行で実行できます。

List<string> list = new List<string>() { "Hi", "Old" };
string line = String.Join(",", list.ToArray());

拡張メソッドを作成することもできます(そのように)

public static string SuperJoin(string joinCharacter, IEnumerable<string> strings)
{
    return String.Join(",", strings.ToArray());
}

次に、Linqを使用して、結合するオブジェクトからフィールドだけを選択します。代理人は必要ありません

于 2012-08-15T13:58:09.920 に答える