簡體   English   中英

為什么我使用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中有兩個元素,但實際上它只有一個; 如果我將代碼更改為新樣式,則可以得到正確的結果。

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
            {
                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()是返回列表的擴展方法。 您沒有在變量中保留該值,因此盡管您調用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM