List.AddRange()
var ama IList.AddRange()
yok.
Bu bana garip geliyor. Bunun arkasındaki sebep nedir?
List.AddRange()
var ama IList.AddRange()
yok.
Bu bana garip geliyor. Bunun arkasındaki sebep nedir?
Yanıtlar:
Çünkü bir arayüzün uygulanması kolay olmalı ve "mutfak dışında her şeyi" içermemelidir. Eğer AddRange
eklerseniz InsertRange
ve RemoveRange
(simetri için) eklemelisiniz . Daha iyi bir soru, IList<T>
arayüz için arayüze benzer uzantı yöntemlerinin neden olmadığıdır IEnumerable<T>
. (Yerinde için uzatma yöntemleri Sort
, BinarySearch
... yararlı olurdu)
IFoo
) Bildiriminin bir "yardımcı" ad alanı (örn. MyAssembly
) Belirtmesinin bir yolu olmaması (ve hala olmaması) çok kötü, öyle ki bir sınıf uygulamayı iddia ediyor IFoo
ancak yöntemden yoksunsa int Bar(String)
, derleyici otomatik olarak üretme yöntemi int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
Böyle bir özellik olsaydı, arayüzler AddRange
, bir temel davranış açısından uygulanabilecek, ancak bazı uygulamaların optimize edebileceği gibi daha fazla yöntem içerebilirdi .
IList üzerinde "AddRange", "Sort", ... için uzatma yöntemlerine sahip olmak isteyenler için,
AddRange
Uzantı yöntemi aşağıdadır :
public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (newList == null)
{
throw new ArgumentNullException(nameof(newList));
}
if (source is List<T> concreteList)
{
concreteList.AddRange(newList);
return;
}
foreach (var element in newList)
{
source.Add(element);
}
}
Bunu yapan küçük bir kütüphane oluşturdum. Her projede genişletme yöntemlerini yeniden yapmak zorunda kalmaktan daha pratik buluyorum.
Bazı yöntemler List'ten daha yavaştır ancak işi yaparlar.
İşte ilgilerini çekecek GitHub:
AddRange/RemoveRange/InsertRange
, doğrudan "dahili" toplama üzerinde çalışabilir veCapacity
yönetimi optimize edebilir veArray.Copy
veri blokları arasında dolaşmak gibi yöntemler kullanabilir . Bir uzatma yöntemiRemoveRange
muhtemelen daha yavaş bir büyütme sırası olacaktırList.RemoveRange