2

我是 OOP 的新手,所以请考虑到这一点。我将从这个匹配中获得的数据放入一个类的对象中,但它是在 foreach 循环中完成的,所以每次调用它时,我的对象内的数据都会被覆盖,最后我希望所有数据都在我的目的。但我只有上一场比赛。我应该怎么做才能避免这种覆盖?也许我以完全错误的方式做这件事?

foreach (var match in matches)
            {
                dataTable.Rows.Add(new Group[] { match.Groups["C0"], match.Groups["C1"], match.Groups["C2"], match.Groups["C3"], match.Groups["C4"] });

                MyClass sk = new MyClass();

                sk.Category = match.Groups["C0"].ToString();
                sk.Device = match.Groups["C1"].ToString();
                sk.Data_Type = match.Groups["C2"].ToString();
                sk.Value = match.Groups["C3"].ToString();
                sk.Status = match.Groups["C4"].ToString();
            }
4

4 回答 4

6

创建一个列表:

var list = new List<MyClass>();
foreach (var match in matches)
{
    dataTable.Rows.Add(new Group[] { match.Groups["C0"], match.Groups["C1"],
        match.Groups["C2"], match.Groups["C3"], match.Groups["C4"] });

    var sk = new MyClass {
        Category = match.Groups["C0"].ToString(),
        Device = match.Groups["C1"].ToString(),
        Data_Type = match.Groups["C2"].ToString(),
        Value = match.Groups["C3"].ToString(),
        Status = match.Groups["C4"].ToString()
    };
    list.Add(sk);
}

那么你就有了列表中的所有项目。您还可以使用 LINQ,例如:

var items = from match in matches
            select new MyClass {
                Category = match.Groups["C0"].ToString(),
                Device = match.Groups["C1"].ToString(),
                Data_Type = match.Groups["C2"].ToString(),
                Value = match.Groups["C3"].ToString(),
                Status = match.Groups["C4"].ToString()
            };

并迭代items

于 2013-07-30T08:20:09.403 回答
3

对象 sk 在循环的每次迭代中都超出范围。

如果您想保留它们的列表,请尝试这样的事情:

var list = new List<MyClass>();
foreach (var match in matches)
{
    dataTable.Rows.Add(new Group[] { match.Groups["C0"], match.Groups["C1"], match.Groups["C2"], match.Groups["C3"], match.Groups["C4"] });
    MyClass sk = new MyClass();
    sk.Category = match.Groups["C0"].ToString();
    sk.Device = match.Groups["C1"].ToString();
    sk.Data_Type = match.Groups["C2"].ToString();
    sk.Value = match.Groups["C3"].ToString();
    sk.Status = match.Groups["C4"].ToString();
    list.Add(sk);
}
于 2013-07-30T08:21:49.153 回答
2

这个问题与 OOP本身没有任何关系。它更多地与范围的概念有关。你没有对sk你创建的对象做任何事情。因此,当您的代码到达循环体的底部时,将sk被丢弃。

也许您打算将对对象的引用存储在列表中:

//Create a list to store your new shiny sk objects
List<MyClass> sks = new List<MyClass>();

foreach (var match in matches)
{
    dataTable.Rows.Add(new Group[] { match.Groups["C0"], match.Groups["C1"], match.Groups["C2"], match.Groups["C3"], match.Groups["C4"] });

    MyClass sk = new MyClass();

    sk.Category = match.Groups["C0"].ToString();
    sk.Device = match.Groups["C1"].ToString();
    sk.Data_Type = match.Groups["C2"].ToString();
    sk.Value = match.Groups["C3"].ToString();
    sk.Status = match.Groups["C4"].ToString();

    //Add the object to your list
    sks.Add(sk);
}
于 2013-07-30T08:21:07.340 回答
1

你需要的是一个列表或类似的东西:

List<MyClass> myList = new List<MyClass>();
foreach (var match in matches)
{
       dataTable.Rows.Add(new Group[] { match.Groups["C0"], match.Groups["C1"], match.Groups["C2"], match.Groups["C3"], match.Groups["C4"] });

       MyClass sk = new MyClass();

       sk.Category = match.Groups["C0"].ToString();
       sk.Device = match.Groups["C1"].ToString();
       sk.Data_Type = match.Groups["C2"].ToString();
       sk.Value = match.Groups["C3"].ToString();
       sk.Status = match.Groups["C4"].ToString();
       myList.Add(sk);
}

在此代码的末尾,您将拥有其中的所有项目,例如myList,您可以通过它们foreach

于 2013-07-30T08:20:40.353 回答