IList neden AddRange'ı desteklemiyor


91

List.AddRange()var ama IList.AddRange()yok.
Bu bana garip geliyor. Bunun arkasındaki sebep nedir?

Yanıtlar:


69

Çü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)


36
@ShdNx Performans açısından uygulamak çok da önemsiz değiller. Bir "dahili" AddRange/RemoveRange/InsertRange, doğrudan "dahili" toplama üzerinde çalışabilir ve Capacityyönetimi optimize edebilir ve Array.Copyveri blokları arasında dolaşmak gibi yöntemler kullanabilir . Bir uzatma yöntemi RemoveRangemuhtemelen daha yavaş bir büyütme sırası olacaktırList.RemoveRange
xanatos

2
Bir arabirim (örn. 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 .
supercat

1
Uzatma yöntemleri olarak uygulanabilirler, bu şekilde arayüz uygulamasının bunları uygulaması gerekmez. Neden değiller?
Tom Pažourek

15
Bu anlamlı değil. Bir arayüz bir uygulamayı özetler, böylece aynı temel özelliklerin birden fazla uygulaması olabilir; bir arayüzden özelliklerin çıkarılması için hiçbir neden yoktur, çünkü "uygulama zordur". Arayüzde "AddRange" gibi yöntemler olmadan, temeldeki nesnenin onları desteklediğine dair bir garanti yoktur ve bu noktada, ya optimal olmayan bir uzantı uygulamak ya da tehlikeli varsayımlar yapmaya çalışırken bir arayüz kullanma amacını bozmak zorunda kalırsınız. belirli bir uygulama sınıfına dönüşür. Dumbed-down arayüzler aşırı kullanılır.
Triynko

3
Yığın işlemleri destekleyen IRangeList arabirimi olmalı, yalnızca dahili olarak en uygun uygulamaya sahip olacak bazı koleksiyonlarda uygulanmalıdır.
çok

10

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:

IListExtension deposu


çok güzelsin
Elnoor

Teşekkürler :). olağanüstü bir şey değil
Emilien Mathieu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.