我有这段代码:
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()
时,它正常工作。
那为什么会发生这种情况以及如何克服它?
答案 0 :(得分:5)
当您编写ul
时,如果strs.Add(str)
添加到您的列表列表中的完全相同的实例,则会在之后清除。因此,调用List<string>
将反映在对该实例的所有引用中,也会反映在str.Clear
,strs[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()
。