Это мой старый код, который не может дать правильный результат.
IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
testList.ToList().AddRange(testList2);
Я предполагаю, что в testList есть два элемента, но на самом деле он только один; Если я изменю свой код на новый стиль, он может получить правильный результат. Пример:
IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
var result=testList.ToList();
result.AddRange(testList2);
В результате у него успешно есть два элемента. Я предполагаю, что причина в том, что 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);
}
Спасибо за ответ и согласен с моим комментарием. Еще раз спасибо.
@ Moises.Li Обновил ответ дополнительной информацией. Может помочь.
ToList() - это метод расширения, который возвращает список. Вы не храните это значение в переменной, поэтому, хотя вы вызываете 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 в моем коде обязательно. Спасибо за ответ.
В чем именно заключается ваш вопрос? Что ты пытаешься сделать?