我一直在尝试编写一个可以扫描原始数据文件并将其规范化以用于数据挖掘过程的程序,我试图从文件中读取数据并以这种方式将其存储在列表中:
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]。[变量名]不是变量,不能以这种方式修改。我的问题是,执行此操作的有效方法是什么。
答案 0 :(得分:3)
struct Normalize
是值类型,而不是引用类型,因此您无法更改其字段。将其更改为class Normalize
答案 1 :(得分:1)
将 struct Normalize
更改为 class Normalize
并使用foreach循环进行迭代。它更清洁。
您还可以将变量设置为private,并使用getters / setter来检查/设置变量。
foreach (Normalize x in X)
{
if (x.getAge() > 0 && x.getAge() <= 5)
x.setAge(1)
...
}
修改强> 刚刚看到你已经得到了答案
答案 2 :(得分:1)
修改struct字段只要它是一个单独的实体(给定它为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所提到的,如果你想修改它,你应该去创建类而不是struct。
在旁注中,始终建议使用immutable structs
而不是可变结构。