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 AddRangeeklerseniz InsertRangeve 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 IFooancak 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,
AddRangeUzantı 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 veCapacityyönetimi optimize edebilir veArray.Copyveri blokları arasında dolaşmak gibi yöntemler kullanabilir . Bir uzatma yöntemiRemoveRangemuhtemelen daha yavaş bir büyütme sırası olacaktırList.RemoveRange