0

生データファイルをスキャンしてデータマイニングプロセス用に正規化できるプログラムを作成しようとしましたが、ファイルからデータを読み取って次のようにリストに保存しようとしました:

public static List<Normalize> NF()
    {
        //Regex r = new Regex(@"^\d+$");
        List<Normalize> N = new List<Normalize>();
        StreamReader ss = new StreamReader(@"C:\Users\User\Desktop\NN.txt");
        String Line = null;
        while (!ss.EndOfStream) {
            Line = ss.ReadLine();
            var L = Line.Split(',').ToList();
            N.Add(new Normalize { age = Convert.ToInt16(L[0]), 
                                  Sex = L[1], 
                                  T3 = Convert.ToDouble(L[2]),
                                  TT4 = Convert.ToDouble(L[3]),
                                  TFU = Convert.ToDouble(L[4]),
                                  FTI = Convert.ToDouble(L[5]),
                                  RC = L[6],
                                  R = L[7]
            });
        }
        return N;
    }
}
struct Normalize {
   public int age;
   public String Sex;
   public double T3;
   public double TT4;
   public double TFU;
   public double FTI;
   public String RC;
   public String R;
}

この時点で、作成したリストを調べて、次のようにデータを分類したいと思います。

   var X= NF();
   for (int i = 0; i < X.Count; i++) {
            if (X[i].age > 0 && X[i].age <= 5) { // Change the X[i].age value to 1 }
            else if (X[i].age > 5 && X[i].age <= 10) { // Change the X[i].age value to 2 }
            ...
        }

しかし、コンパイラは X[i].[変数名] は変数ではなく、この方法で変更できないと言います。私の質問は、この操作を実行する効率的な方法は何でしょうか。

4

3 に答える 3

1

構造体フィールドの変更は、それが単一のエンティティである限り問題ありません ( a が与えられた場合mutable struct)。これは可能です -

var obj = new Normalize();
obh.Age = 10;

しかし、あなたの場合、リストからインデクサーを使用して構造体にアクセスしています。

Indexer will return copy of your struct and modifying the value won't reflect it back to the listあなたがしたくないです。

したがって、コンパイラはエラーをスローして、これを書き出さないようにしています。

アレックスが述べたように、構造体を変更したい場合は、構造体ではなくクラスを作成する必要があります。

immutable structs補足として、変更可能な構造体の代わりに使用することを常にお勧めします。

于 2013-08-25T19:12:23.747 に答える