2013-08-25 141 views
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] [。變量名稱]不是一個變量,不能用這種方式修改。我的問題是,什麼是執行此操作的有效方法。

+1

定義了哪個'X'? –

+0

@JeroenVannevel我會編輯我的問題。 – Transcendent

+1

'struct Normalize'是一個值類型,而不是引用類型,因此你不能像這樣改變它的字段。將其更改爲'class Normalize' – Alex

回答

3

struct Normalize是值類型,不是引用類型,因此,你不能改變它的領域這樣。將其更改爲class Normalize

1

變化struct Normalizeclass Normalize與foreach循環迭代。它更清潔。
您也可以將變量設置爲private,並使用getter/setter來檢查/設置變量。

foreach (Normalize x in X) 
{ 
    if (x.getAge() > 0 && x.getAge() <= 5) 
     x.setAge(1) 
    ... 
} 

編輯: 剛纔看到你已經得到了你的答案

1

只要它是單個實體(指定其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這不是你想要的。

因此,編譯器拋出錯誤來阻止你寫出來。

由於Alex提到,如果你想修改它,你應該去創建類而不是結構。

在附註中,始終建議使用immutable structs而不是可變結構。