对象列表无法按预期工作

本文关键字:工作 列表 对象 | 更新日期: 2023-09-27 18:26:31

我想创建一个对象列表。我创建了一个类,我将使用我的对象列表

public class DataSet 
{
    public string[] setOfValues = new string[5];
}

当我在代码中使用这个类时,我无法擦除字符串数组,因为对象列表也会被更改。

    void Button1Click(object sender, EventArgs e)
    {
        List<DataSet> myListOfDataSets = new List<DataSet>();
        DataSet mySet = null;
        string[] myArrayOfStrings = {"One", "Two", "Three", "Four", "Five"};
        mySet = new DataSet();
        mySet.setOfValues = myArrayOfStrings;
        myListOfDataSets.Add(mySet);
        for(int i = 0; i < 5; i++)
        { //this command wipes off the values from myListOfDataSets
            myArrayOfStrings[k] = string.Empty; 
        }
    }
}

我希望能够在不影响myListOfDataSets的情况下重用myArrayOfStrings。一旦我向myListOfDataSets添加了一个新对象,我就不明白后来应用于不同项的命令是如何更改此列表的内容的。

对象列表无法按预期工作

它们是相同的

C#中的类和数组变量只是引用。实际的对象在堆中的某个地方。您所做的所有指定都只是移动同一对象的参照。

您可以做的是替换引用:

void Button1Click(object sender, EventArgs e)
{
    List<DataSet> myListOfDataSets = new List<DataSet>();
    DataSet mySet = null;
    string[] myArrayOfStrings = {"One", "Two", "Three", "Four", "Five"};
    mySet = new DataSet();
    mySet.setOfValues = myArrayOfStrings;
    myListOfDataSets.Add(mySet);
    //sets variable to **new** object instance, so it no
    // longer refers to the old one
    myArrayOfStrings = new string[] {"","","","",""};
    //This whole section is now redundant
    for(int i = 0; i < 5; i++)
    { //this command wipes off the values from myListOfDataSets
        myArrayOfStrings[k] = string.Empty; 
    }
}

您可以进一步显著缩短所有这些代码,如下所示:

void Button1Click(object sender, EventArgs e)
{
    var myListOfDataSets = new List<DataSet>
    {
      new DataSet() {setOfValues = {"One", "Two", "Three", "Four", "Five"} }
    };
}

因此,您正在将"mySet的setOfValues"设置为位于myArrayOfStrings地址的数组。这意味着mySet的setOfValues不是一个单独的对象,而是一个相同的对象。这就是为什么当您更新myArrayOfStrings时,mySet的值也会发生变化。

要获得您要查找的结果,请循环myArrayOfStrings并将mySet.setOfValues[i]设置为myArrayOfStrings[i],这样您就应该设置好了!