2009-11-03 75 views
6

我嘗試做靜態類,添加到icollection,但我有一些問題,我似乎無法克服。那我是如何得到的,所以我可以在方法中傳遞ICollection?因爲T就是說它不能解決。T在課堂上? AddRange ICollection?

然後我想知道有沒有辦法在icollection上做AddRange?

我在想這樣的事情,但maby我的方式出了我的腦海裏呢?

public static ICollection<T> add(this IEnumerable<T> list) 
    { 
     ICollection<T> collection = null; 

     return collection.AddRange(list);    
    } 
+2

爲什麼降價? – 2009-11-03 15:33:06

回答

15

不,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; 
} 
+0

愛這個新名字......不知道它是誰。 :-P – 2009-11-03 14:26:58

+0

你缺少一個通用的方法參數:) – leppie 2009-11-03 14:27:00

+0

@leppie:剛剛發現,在編輯。 – 2009-11-03 14:27:39

4

如果我理解正確,您希望將IEnumerable<T>添加到空集合中。

那豈不是更容易只是做:

ICollection<MyObject> collection = new List<MyObject>(GetIEnumerableOfMyObject()); 

甚至:

ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList(); 
+0

我不知道我可以做ICollection,然後做那樣的列表。 – 2009-11-03 14:37:34

+0

'List '' implements'ICollection 'so yup。 – 2009-11-03 14:42:56

0

根據集合類型的源列表的另一種方法是使用List(T).ForEach,如:

List<string> source = ... 
ICollection<string> dest = ... 

source.Foreach(dest.Add); 

但是,其可讀性爲easy to dispute

1

其他方式似乎認爲您的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); 
    } 
} 

注意的是,由於列表impliments ICollection的,直接與List對象時,這可能會引起歧義(雖然我還沒有測試過,如果編譯器能解決它 - 我的直覺反應是,它應該,因爲AddRange是List的成員,並且編譯器會在查看擴展之前先通過成員函數,但如果我錯了我相信有人會糾正我)。