簡體   English   中英

將列表項添加到集合時,AddRange() 不起作用

[英]AddRange() is not working when adding list items to a Collection

最近,我接到一項處理 FxCop 警告之一的任務 -不要公開通用列表 所以我嘗試將List<T>更改為ICollection<T> 但是后來,在進行單元測試時,我發現AddRange()沒有按預期正常工作。 它不是將元素集合添加到集合對象中。

這是示例代碼

gc.ToList().AddRange(sampleList);

我有兩個問題要問

  1. 為什么不將項目添加到集合中。 下面是代碼:

     public class GenericClass { public int Id; public string Name; } class Program { static void Main(string[] args) { ICollection<GenericClass> gc = new List<GenericClass>(); var sampleList = new List<GenericClass>() { new GenericClass {Id = 1, Name = "ASD"}, new GenericClass {Id = 2, Name = "QWER"}, new GenericClass {Id = 3, Name = "BNMV"}, }; Console.WriteLine(gc.GetType()); // gc is of type gc.ToList().AddRange(sampleList); // sampleList items are not getting added to gc. Console.ReadKey(); }

    }

  2. List<T>繼承自ICollection<T>並且List<T>具有AddRange()等功能。 當我嘗試將父引用( ICollection<T> )轉換為子類對象( List<T> )時,為什么 Intellisense 不建議AddRange() 相反,我需要做.ToList()然后它顯示AddRange() 截屏

我為此搜索了很多。 但找不到讓我滿意的理由。 所以請幫助我理解。 這將是一個很大的幫助。

AddRange()方法工作正常。 問題是,您沒有仔細閱讀ToList()擴展方法的文檔,因此沒有意識到ToList()方法返回一個全新的 object

文檔

從 IEnumerable<T> 創建一個 List<T>。

由於您調用AddRange()的對象實際上不是原始集合,因此原始集合保持不變。

從某種意義上說,您的問題是List<T>相當於非常常見的問題“為什么string.Replace()不起作用?”

在您給出的示例中,沒有比首先不隱藏List<T>更好的解決方案。 由於您使用的是通用ICollection<T>接口,因此您可以編寫自己的AddRange()作為擴展方法:

public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> range)
{
    foreach (T t in range)
    {
        collection.Add(t);
    }
}

但是,如果目標是能夠修改對象並使用AddRange()方法,我不相信這真的比將類型保留為List<T> AddRange()

ICollection<T>引用轉換回其底層List<T> (正如另一個回答者所建議的)是毫無意義的,因為這樣做首先會否定使用ICollection<T>接口的任何價值。

只需將引用保留為List<T> ,至少在您實際需要修改集合的任何上下文中。 (僅使用ICollection<T>在其他上下文中公開該列表很好,甚至可能有益,但這是一個完全不同的討論。)

只要我在回答,我就會提到我懷疑您是否正確理解了 FxCop 警告的意圖,因為公開通用列表本身並不是有害的。

ToList()返回一個新實例,這就是為什么您無法在“gc”中看到 AddRange 的結果的原因。 如果您真的想使用 AddRange,您可以執行以下操作。

((List<GenericClass>)gc).AddRange(sampleList);

暫無
暫無

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

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