List.AddRange()
ada, tapi IList.AddRange()
tidak.
Ini menurut saya aneh. Apa alasan dibalik ini?
List.AddRange()
ada, tapi IList.AddRange()
tidak.
Ini menurut saya aneh. Apa alasan dibalik ini?
Jawaban:
Karena antarmuka harus mudah diimplementasikan dan tidak berisi "segalanya kecuali dapur". Jika Anda menambahkan AddRange
Anda harus menambahkan InsertRange
dan RemoveRange
(untuk simetri). Pertanyaan yang lebih baik adalah mengapa tidak ada metode ekstensi untuk IList<T>
antarmuka yang mirip dengan IEnumerable<T>
antarmuka. (metode penyuluhan untuk di-tempat Sort
, BinarySearch
... akan berguna)
IFoo
) Deklarasi untuk menentukan namespace "helper" (mis. MyAssembly
) Sedemikian rupa sehingga jika kelas mengklaim untuk mengimplementasikan IFoo
tetapi tidak memiliki metode int Bar(String)
, kompilator akan otomatis- menghasilkan metode int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
Seandainya fitur seperti itu ada, antarmuka dapat menyertakan lebih banyak metode seperti AddRange
yang dapat diimplementasikan dalam hal perilaku dasar, tetapi beberapa implementasi dapat mengoptimalkan.
Bagi mereka yang ingin memiliki metode ekstensi untuk "AddRange", "Sort", ... di IList,
Di bawah ini adalah AddRange
metode ekstensi:
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);
}
}
Saya membuat perpustakaan kecil yang melakukan ini. Saya merasa lebih praktis daripada harus mengulangi metode ekstensi pada setiap proyek.
Beberapa metode lebih lambat daripada List tetapi mereka melakukan pekerjaan itu.
Inilah GitHub yang menarik minat mereka:
AddRange/RemoveRange/InsertRange
dapat bekerja langsung pada pengumpulan "internal" dan mengoptimalkanCapacity
pengelolaan dan menggunakan metode sepertiArray.Copy
memindahkan blok data. Metode ekstensiRemoveRange
mungkin akan menjadi urutan magniture lebih lambat dariList.RemoveRange