为何调用IList.ToList().AddRange()后未得到预期集合结果?
问题分析与解决方案
嘿,我一眼就看出问题出在哪了!咱们先拆解下你那段旧代码的问题:
旧代码的问题根源
你看这段代码:
IList<string> testList=new List<string>(); testList.Add("string1"); var testList2=new List<string>(testList); testList.ToList().AddRange(testList2);
这里的关键坑是:testList.ToList()会创建一个全新的ListAddRange(testList2)其实是在这个临时副本上添加元素,完全没碰原来的testList!所以最后原集合自然还是只有1个元素。
正确的写法
要修改原集合的话,直接在原实例上调用AddRange就行。因为你声明的testList实际是List<string>类型的实例,只是用IList<string>接口来引用它,所以可以用以下两种方式操作:
写法一(直接强制转换,适合确定实际类型的场景)
IList<string> testList=new List<string>(); testList.Add("string1"); var testList2=new List<string>(testList); // 直接操作原实例 ((List<string>)testList).AddRange(testList2);
写法二(安全类型检查,适合不确定实际类型的场景)
IList<string> testList=new List<string>(); testList.Add("string1"); var testList2=new List<string>(testList); var actualList = testList as List<string>; if (actualList != null) { actualList.AddRange(testList2); }
这样操作后,testList里就会包含两个"string1"元素,完全符合你的预期啦!
内容的提问来源于stack exchange,提问作者Moises .Li
相关产品推荐
相关产品推荐

