0

私は次のクラスを持っています:

public class ListOfVariablesToSave : List<List<int>>
{
    public List<int> controlDB { get; set; }
    public List<int> interacDB { get; set; }

    public ListOfVariablesToSave()
    {
        controlDB = new List<int> { 1, 2, 3 };
        interacDB = new List<int> { 21, 22, 23 };

        Add(controlDB);
        Add(interacDB);
    }
}

そして、そのコンテンツをテキスト ファイルに書き込む次のコード:

ListOfVariablesToSave myListOfVariablesToSave = new ListOfVariablesToSave();

StreamWriter myFile = new StreamWriter("fileName.txt");
foreach (List<int> DB in myListOfVariablesToSave)
{
    foreach (int varToSave in DB)
    {
        myFile.WriteLine(varToSave);
    }
}
myFile.Close();

私が得るものは次のとおりです。

1
2
3
21
22
23

私が取得したいのは次のとおりです。

controlDB
1
2
3
interacDB
21
22
23

おそらく、最初のコードの後に​​1行のコードを追加するだけでこれを行うことは可能foreachですか?

4

3 に答える 3

2

以下のコードは最善の方法ではありませんが、さらに役立つことを願っています:

モデル:

class ListOfVariablesToSave 
{
    public List<int> controlDB { get; set; }
    public List<int> interacDB { get; set; }
}

コード:

static void Main()
    {
        ListOfVariablesToSave model = new ListOfVariablesToSave();
        List<int> controlDB = new List<int> { 1, 2, 3 };
        List<int> interacDB = new List<int> { 21, 22, 23 };
        model.controlDB = controlDB;
        model.interacDB = interacDB;


        StreamWriter myFile = new StreamWriter("fileName.txt");
        foreach (var prop in model.GetType().GetProperties())
        {
            myFile.WriteLine(prop.Name);
            foreach (var prop1 in model.GetType().GetProperties())
            {
                if (String.Compare(prop1.Name, prop.Name) == 0)
                {
                    foreach (int varToSave in (List<int>)prop1.GetValue(model, null))
                    {
                        myFile.WriteLine(varToSave);
                    }
                }
            }

        }
        myFile.Close();
    }
于 2015-06-03T03:25:29.860 に答える
2

私はこのようなことを考えます:

public class ListOfVariablesToSave : List<ListOfThings<int>>
{
    public ListOfThings<int> controlDB { get; set; }
    public ListOfThings<int> interacDB { get; set; }

    public ListOfVariablesToSave()
    {
        controlDB = new ListOfThings<int>() { 1, 2, 3  };
        controlDB.Name = "controlDB";
        interacDB = new ListOfThings<int>() { 21, 22, 23 };
        interacDB.Name = "interacDB";

        Add(controlDB);
        Add(interacDB);
    }

}

public class ListOfThings<T> : List<T>
{
    public string Name { get; set; }

    public ListOfThings() : base() { }
}

あなたListOfVariablesToSaveから派生する代わりに、あなたの name プロパティList<List<int>>から派生して追加する別のクラスを作成します。List<int>

次に、次のように繰り返すことができます。

var lists = new ListOfVariablesToSave();
foreach (var list in lists) 
{
    Console.WriteLine(list.Name);
    foreach (var i in list)
    {
        Console.WriteLine(i);
    }
}
于 2015-06-03T02:21:32.963 に答える
1

これはリフレクションを使用してトリックを行いました(代わりに Console.WriteLine を変更してファイルに移動します):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        ListOfVariablesToSave myListOfVariablesToSave = new ListOfVariablesToSave();

        foreach (PropertyInfo pi in myListOfVariablesToSave
                 .GetType()
                 .GetProperties( BindingFlags.Public | 
                                 BindingFlags.Instance | 
                                 BindingFlags.DeclaredOnly )
                 // Only get the properties of type List<int>
                 // Actual PropertyType looks like: 
                 //   System.Collections.Generic.List`1[System.Int32]
                 .Where(p => p.PropertyType.ToString().Contains("List") && 
                        p.PropertyType.ToString().Contains("System.Int32"))
                )
        {
            Console.WriteLine(pi.Name);
            (pi.GetValue(myListOfVariablesToSave) as List<int>).ForEach(i => Console.WriteLine(i));
        }
    }
}

public class ListOfVariablesToSave : List<List<int>>
{
    public List<int> controlDB { get; set; }
    public List<int> interacDB { get; set; }
    // Added this property to show that it doesn't get used in the above foreach
    public int Test {get; set;}

    public ListOfVariablesToSave()
    {
        controlDB = new List<int> { 1, 2, 3 };
        interacDB = new List<int> { 21, 22, 23 };
        Add(controlDB);
        Add(interacDB);
    }
}

結果:

controlDB
1
2
3
interacDB
21
22
23

ここで実際のサンプルを参照してください... https://dotnetfiddle.net/4yyc8Q

アップデート

Matt Burland のクラス構造を使用すると、煩雑さが軽減されます (繰り返しますが、代わりに Console.WriteLine を置き換えてファイルに移動します)。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        ListOfVariablesToSave myListOfVariablesToSave = new ListOfVariablesToSave();

        myListOfVariablesToSave.ForEach(m => {
            Console.WriteLine(m.Name);
            m.ForEach(m1 => Console.WriteLine(m1));
        });
    }
}

public class ListOfVariablesToSave : List<ListOfThings<int>>
{
    public ListOfThings<int> controlDB { get; set; }
    public ListOfThings<int> interacDB { get; set; }

    public ListOfVariablesToSave()
    {
        controlDB = new ListOfThings<int>() { 1, 2, 3  };
        controlDB.Name = "controlDB";
        interacDB = new ListOfThings<int>() { 21, 22, 23 };
        interacDB.Name = "interacDB";

        Add(controlDB);
        Add(interacDB);
    }

}

public class ListOfThings<T> : List<T>
{
    public string Name { get; set; }

    public ListOfThings() : base() { }
}

結果:

controlDB
1
2
3
interacDB
21
22
23

ここで実際のサンプルを参照してください... https://dotnetfiddle.net/CKsIFo

于 2015-06-03T02:41:17.897 に答える