2009-11-03 11 views
6

Statik sınıf yapmayı deniyorum, icollection'a ekleyin ama üstesinden gelemediğim bazı sorunlarım var. Bu şekilde, nasıl bir ICollection yöntemini kullanabilirim? çünkü T, çözülemeyeceğini söylüyor.T? AddRange ICollection?

ve sonra icollection üzerinde AddRange yapmanın bir yolu var mı?

Böyle bir şey düşünüyordum, ama mee aklımdan çıkmış bir şey mi?

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

     return collection.AddRange(list);    
    } 
+2

Neden işaretleme? –

cevap

15

Hayır, ICollection<T> bir AddRange yöntemi yoktur - ve olsa bile, bir NullReferenceException atacağım dereference null çalışıyor olurdum. Listeyi eklemek için bir koleksiyon belirtmediniz ... tam olarak ne yapmaya çalışıyorsunuz?

Sen (diyelim) Yeni bir List<T> oluşturabilir - ve bu bir IEnumerable<T> alabilir zaten yapıcı olmasının avantajı vardır: Eğer gerçekten sadece Enumerable.ToList() reimplemented ettik bu noktada, Ancak

public static ICollection<T> Add<T>(this IEnumerable<T> list) 
{ 
    return new List<T>(list);    
} 

ve

public static ICollection<T> AddTo<T>(this IEnumerable<T> list, 
             ICollection<T> collection) 
{ 
    foreach (T item in list) 
    { 
     collection.Add(item); 
    } 
    return collection; 
} 
: varolan koleksiyona her şeyi eklemek istiyorsanız farklı bir döndürme türü o verilen ...

, böyle bir şey isteyebilirsiniz

+0

Yeni adı seviyorum, onun da kim olduğu hakkında hiçbir fikrim yoktu. : -P –

+0

Genel bir yöntem argümanı eksiksiniz :) – leppie

+0

@leppie: Bir düzenlemede bunu fark ettim. –

4

Doğru anlıyorsam boş bir koleksiyona IEnumerable<T> eklemek istiyorsunuz.

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

Hatta:

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

Bir ICollection yapabileceğimi bilmiyordum, o zaman böyle bir liste yapıyordum. –

+0

'List ' Uygulaması 'ICollection ' yup. –

0

alternatif bir yaklaşım olduğu gibi List(T).ForEach kullanmaktır kaynak listesinin toplama türüne bağlı

sadece yapmak kolay olmaz :

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

source.Foreach(dest.Add); 

Ancak bu okunabilirliği easy to dispute olduğunu.

1

Diğer yollar, ICollection öğenizin boş olduğunu ve/veya ICollection öğesinin bir tür Liste olduğunu varsayar.

public static void AddRange<T>(this ICollection<T> ic, IEnumerable<T> ie) 
{ 
    foreach (T obj in ie) 
    { 
     ic.Add(obj); 
    } 
} 

Not Ancak Liste nesnelerle doğrudan uğraşırken ben olsa Liste impliments ıcollection beri, bu (belirsizlik neden olabileceğini,: Eğer AddRange istiyorsanız aşağıdaki gibi Ancak, o zaman ıcollection sınıfını uzatın edebilirsiniz ancak derleyici bunu çözebilirse test ettim - AddRange List'in bir üyesi olduğundan ve derleyici uzantılara bakmadan önce ilk önce üye işlevlerinden geçeceğinden, ancak benim yanılsamam gereken tepki budur. Eminim birisi beni düzeltir.