列表与LT;>用旧列表覆盖值

时间:2018-05-21 13:05:42

标签: c# list

我有这段代码:

List<List<string>> strs = new List<List<string>>();
List<string> str = new List<string>();

foreach (DataGridViewRow sr in dataGridView1.SelectedRows)
{
    if(i >= 10)
    {
        strs.Add(str); //Here strs have one str with 10 values
        str.Clear();
        i = 0;
        var a = strs; //Here strs have one str with 0 values
    }
    str.Add(sr.Cells["MOBILNI"].Value.ToString().Trim());
    i++;
}
strs.Add(str);

我列出了strings我填充的内容,当它达到10个成员时,我将整个列表放入List<string>列表中,然后清除strings列表以填充下一个10项目。问题是,当strings列表达到10个成员时,我将其添加到List<string>列表中并在调试中看到我的strs有1个成员(List<string>),其中有10个成员元素(10个字符串),但是当我清除strings的基本列表时,它也会清除List<List<string>>中的列表。

当我使用str = new List<string>()代替str.Clear()时,它正常工作。

那为什么会发生这种情况以及如何克服它?

3 个答案:

答案 0 :(得分:5)

当您编写ul时,如果strs.Add(str)添加到您的列表列表中的完全相同的实例,则会在之后清除。因此,调用List<string>将反映在对该实例的所有引用中,也会反映在str.Clearstrs[0]等中。这是因为strs[1]reference-type。使用一个引用执行任何操作都将反映在所有引用中。另一方面,值类型将在将对象传递给方法时复制整个对象。因此,在调用List<T>之后,以下代码将在i中具有值4

DoSomething

为了避免这种情况,你必须创建一个全新的列表,而不是仅仅添加现有的列表:

int i = 4;
var result = DoSomething(i);

void DoSomething(int j)
{
    j = -7;
}

答案 1 :(得分:1)

您需要在清除前添加原始列表的副本,以便使用.ToList

foreach (DataGridViewRow sr in dataGridView1.SelectedRows)
{
    if(i >= 10)
    {
        strs.Add(str.ToList()); //Here strs have one str with 10 values
        str.Clear();
        i = 0;
        var a = strs; //Here strs have one str with 0 values
    }
    str.Add(sr.Cells["MOBILNI"].Value.ToString().Trim());
    i++;
}
strs.Add(str);

您的另一个选择是,将str设置为全新列表,而不是清除它:

foreach (DataGridViewRow sr in dataGridView1.SelectedRows)
{
    if(i >= 10)
    {
        strs.Add(str); //Here strs have one str with 10 values
        str = new List<string>();
        i = 0;
        var a = strs; //Here strs have one str with 0 values
    }
    str.Add(sr.Cells["MOBILNI"].Value.ToString().Trim());
    i++;
}
strs.Add(str);

答案 2 :(得分:0)

当您将E/launcher - Error: SyntaxError: C:/Users/home/Desktop/testing_protractor/test reali/login_1/features/test.feature: Unexpected token, expected ; (1:16) 1 | Feature: Verify the login page as UK customer | ^ 2 | As I am a UK customer 3 | I want to open the login page 4 | So that I can see the login page content and go to my-cart page at Parser.pp$5.raise (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:4454:13) at Parser.pp.unexpected (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:1761:8) at Parser.pp.semicolon (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:1742:38) at Parser.pp$1.parseExpressionStatement (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:2236:8) at Parser.pp$1.parseStatement (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:1911:17) at Parser.pp$1.parseLabeledStatement (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:2228:20) at Parser.pp$1.parseStatement (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:1909:17) at Parser.pp$1.parseBlockBody (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:2268:21) at Parser.pp$1.parseTopLevel (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:1778:8) at Parser.parse (C:\Users\home\Desktop\testing_protractor\test reali\login_1\node_modules\babylon\lib\index.js:1673:17) [15:04:28] E/launcher - Process exited with error code 100 添加到List<string>时,实际上只是传递List<List<string>>的指针(引用),而不是整个对象。这就是为什么当你调用List<string>时,它会清除str.clear()中指针指向的列表对象。在将对象添加到List<List<string>>时,您应该创建一个新对象(clear())或str = new List<string>();,而不是调用clone()