为什么我使用 IList().toList().AddRange() 时出现错误结果?
Why i have error result by use IList().toList().AddRange()?
那些是我的旧代码,无法响应正确的结果。
IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
testList.ToList().AddRange(testList2);
我以为testList中有两个元素,但实际上只有一个;
如果我将我的代码更改为新样式,它可以获得正确的 result.Example :
IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
var result=testList.ToList();
result.AddRange(testList2);
结果,它成功地有两个 elements.I 猜测原因是 iList().toList() 在其他地方创建一个新的列表,作为参数结果,它独立于 iList()。这样对吗?还是其他原因?
System.Linq
命名空间附带的所有扩展方法都会创建对象的新副本(如果需要,可以进行深层复制)。
所以,当你说在另一个内存位置创建了一个新列表时,你是对的。
要确认两个对象是否不同,可以通过unsafe获取它们的内存地址,自己看。这里有一些东西要测试(如果你使用不安全的代码要小心;你需要自己处理所有的内存管理):
unsafe
{
IList<string> testList = new List<string>();
testList.Add("string1");
var testList2 = new List<string>(testList);
testList.ToList().AddRange(testList2);
TypedReference original = __makeref(testList);
IntPtr originalPointer = **(IntPtr**)(&original);
var isThisANewList = testList;
TypedReference newReferenceOnly = __makeref(testList);
IntPtr newReferenceOnlyPointer = **(IntPtr**)(&newReferenceOnly);
var copy = testList.ToList();
TypedReference deepCopy = __makeref(copy);
IntPtr deepCopyPointer = **(IntPtr**)(&deepCopy);
}
ToList()
是 returns 列表的扩展方法。您没有将该值保存在变量中,因此虽然您调用了 AddRange()
,但您添加的是您在 ToList()
中创建的列表,而不是您的 testList。
在您的第二个示例中,您在结果中正确保存了 ToList()
的值。
var result=testList.ToList();
result.AddRange(testList2);
你有几个选择...
// option 1 declare testList as a List not IList
List<string> testList = new List<string>();
testList.AddRange(testList2);
// option 2 cast testList as a List
((List<string>)testList).AddRange(testList2);
那些是我的旧代码,无法响应正确的结果。
IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
testList.ToList().AddRange(testList2);
我以为testList中有两个元素,但实际上只有一个; 如果我将我的代码更改为新样式,它可以获得正确的 result.Example :
IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
var result=testList.ToList();
result.AddRange(testList2);
结果,它成功地有两个 elements.I 猜测原因是 iList().toList() 在其他地方创建一个新的列表,作为参数结果,它独立于 iList()。这样对吗?还是其他原因?
System.Linq
命名空间附带的所有扩展方法都会创建对象的新副本(如果需要,可以进行深层复制)。
所以,当你说在另一个内存位置创建了一个新列表时,你是对的。
要确认两个对象是否不同,可以通过unsafe获取它们的内存地址,自己看。这里有一些东西要测试(如果你使用不安全的代码要小心;你需要自己处理所有的内存管理):
unsafe
{
IList<string> testList = new List<string>();
testList.Add("string1");
var testList2 = new List<string>(testList);
testList.ToList().AddRange(testList2);
TypedReference original = __makeref(testList);
IntPtr originalPointer = **(IntPtr**)(&original);
var isThisANewList = testList;
TypedReference newReferenceOnly = __makeref(testList);
IntPtr newReferenceOnlyPointer = **(IntPtr**)(&newReferenceOnly);
var copy = testList.ToList();
TypedReference deepCopy = __makeref(copy);
IntPtr deepCopyPointer = **(IntPtr**)(&deepCopy);
}
ToList()
是 returns 列表的扩展方法。您没有将该值保存在变量中,因此虽然您调用了 AddRange()
,但您添加的是您在 ToList()
中创建的列表,而不是您的 testList。
在您的第二个示例中,您在结果中正确保存了 ToList()
的值。
var result=testList.ToList();
result.AddRange(testList2);
你有几个选择...
// option 1 declare testList as a List not IList
List<string> testList = new List<string>();
testList.AddRange(testList2);
// option 2 cast testList as a List
((List<string>)testList).AddRange(testList2);