1

任意のキーと値のタイプで辞書を受け取る関数を作成し、それらをcsvファイルに書き込みたいと思います。たとえば、次のクラスがある場合:

public class VerificationResult
{
    public enum resInfo
    {
        sessionID,
        testFilePath,
        testFileName,
        ID1,
        ID2,
        score1,
        score2,
        isGood,
        isTrue
    };

    public string[] resData = 
        new string[Enum.GetNames(typeof (resInfo)).Length];

    public VerificationResult(int sessionID,
                              string testFilePath,
                              string Id1,
                              string Id2,
                              string score1,
                              string score2,
                              string isGood)
    {
        resData[(int) resInfo.sessionID] = sessionID.ToString();
        resData[(int) resInfo.testFilePath] = testFilePath;
        resData[(int) resInfo.testFileName] =
            Path.GetFileNameWithoutExtension(testFilePath);
        resData[(int) resInfo.ID1] = Id1;
        resData[(int) resInfo.ID2] = Id2;
        resData[(int) resInfo.score1] = Score1;
        resData[(int) resInfo.score2] = Score2;
        resData[(int) resInfo.isGood] = isGood;
        resData[(int) resInfo.isTrue] = (Id1 == IsGood).ToString();
    }
};

および次のように定義された辞書:

private Dictionary<int,VerificationResult> verificationResults

値のメンバー(この場合はVerificationResultクラスのメンバー)のヘッダーを使用して、このディクショナリをcsvファイルに出力できるジェネリック関数を作成したいと思います。

引数として、値型のメンバーの配列または列挙型を送信することにしました。問題は、必要なデータの配列を保持する値クラスメンバーの名前、または(別の方法で実装する場合は)不明な値クラスメンバーを反復処理してファイルに出力する方法がわからないことです。evalのような関数を使用せずにそれを行う方法はありますか?私は多くのことをしようとしていますか?必要になるたびに特定の関数を記述して、そのままにしておく必要がありますか?

4

1 に答える 1

0

デリゲートと連携して、キーと値の文字列表現がどのように見えるかを指定できます。私の例では、IDictionaryの拡張メソッドとしてメソッドを作成しました。

public static class DictionaryExtension {
    public static void WriteToCsv<K, V>(
        this IDictionary<K, V> dictionary,
        string path,
        Func<K, string> keyToString,
        Func<V, string> valueToString,
        string separator) {

        StringBuilder content = new StringBuilder();
        foreach (KeyValuePair<K, V> keyValuePair in dictionary)
            content.AppendLine(string.Join(separator, new List<string> {
                keyToString(keyValuePair.Key),
                valueToString(keyValuePair.Value)
            }));

        File.WriteAllText(path, content.ToString());
    }
}

VerificationResultこれで、次のような任意の内部構造を持つ複合型ができました。

public class ComplexType {
    public int Number { get; set; }
    public string Name { get; set; }
}

および次の辞書:

Dictionary<long, ComplexType> test = new Dictionary<long, ComplexType>();
test.Add(1, new ComplexType { Number = 1, Name = "one"});
test.Add(2, new ComplexType { Number = 1, Name = "two" });
test.Add(3, new ComplexType { Number = 1, Name = "three" });
test.Add(4, new ComplexType { Number = 1, Name = "four" });

シンプルな

test.WriteToCsv(@"C:\temp\dictionarytest.txt",
    key => key.ToString(),
    value => value.Name,
    ";");

辞書を書くのに十分です:

1;one
2;two
3;three
4;four
于 2013-01-03T12:23:39.140 に答える