![](/img/trans.png)
[英]ICollection<T> doesn't have AddRange but List<T> does, is Casting Bad
[英]T in class? AddRange ICollection?
我嘗試做靜態類,添加到icollection但我遇到了一些我似乎無法克服的問題。 這就是我如何得到所以我可以在方法中傳遞ICollection? 因為T就是說它無法解決。
然后我想知道有沒有辦法在icollection上做AddRange?
我在考慮這樣的事情,但maby我已經不在乎了嗎?
public static ICollection<T> add(this IEnumerable<T> list)
{
ICollection<T> collection = null;
return collection.AddRange(list);
}
不, ICollection<T>
沒有AddRange
方法 - 即使它確實如此,你也會嘗試取消引用null
,這將拋出NullReferenceException
。 您尚未指定要將列表添加到的集合...您到底想要做什么?
你可以創建(比方說)一個新的List<T>
- 這樣做的好處就是已經有了一個可以接受IEnumerable<T>
的構造函數:
public static ICollection<T> Add<T>(this IEnumerable<T> list)
{
return new List<T>(list);
}
但是,那時你真的只是重新實現了Enumerable.ToList()
並給它一個不同的返回類型......
如果要將所有內容添加到現有集合中,您可能需要以下內容:
public static ICollection<T> AddTo<T>(this IEnumerable<T> list,
ICollection<T> collection)
{
foreach (T item in list)
{
collection.Add(item);
}
return collection;
}
如果我理解正確,您想要將IEnumerable<T>
添加到空集合中。
這樣做會不會更容易:
ICollection<MyObject> collection = new List<MyObject>(GetIEnumerableOfMyObject());
甚至:
ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList();
其他方式似乎假設您的ICollection為空和/或您的ICollection是一種List。 但是,如果您需要AddRange,則可以按如下方式擴展ICollection類:
public static void AddRange<T>(this ICollection<T> ic, IEnumerable<T> ie)
{
foreach (T obj in ie)
{
ic.Add(obj);
}
}
但請注意,由於List impliments ICollection,這可能會在直接處理List對象時引起歧義(雖然我還沒有測試過,如果編譯器能夠解決它 - 我的直覺反應是它應該,但是,因為AddRange是List的成員,編譯器將在查看擴展之前先查看成員函數,但如果我錯了,我相信有人會糾正我。
根據源列表的集合類型,另一種方法是使用List(T).ForEach
,如:
List<string> source = ...
ICollection<string> dest = ...
source.Foreach(dest.Add);
但是,這種可讀性很容易引起爭議 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.