簡體   English   中英

T在課堂上? AddRange ICollection?

[英]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.

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