C#’ta IEnumerable’ı Listeye Verimli Şekilde Dönüştürme
Bu makale, C#’ta bir IEnumerable<T>
öğesini List<T>
öğesine dönüştürmenin çeşitli yöntemlerini inceleyerek, farklı senaryolar için verimliliklerini ve uygunluklarını karşılaştırmaktadır. Bu veri yapılarının inceliklerini anlamak, optimize edilmiş ve sürdürülebilir kod yazmak için çok önemlidir.
İçerik Tablosu
IEnumerable<T>
veList<T>
AnlamaIEnumerable<T>
öğesiniList<T>
öğesine Ne Zaman Dönüştürülmeli?ToList()
Yöntemini KullanmaList<T>
Oluşturucusunu Kullanma- LINQ Sorgusu Sözdizimini Kullanma
foreach
Döngüsünü Kullanma- Özel Genişletme Yöntemleri Oluşturma
- Sonuç
IEnumerable<T>
ve List<T>
Anlama
Hem IEnumerable<T>
hem de List<T>
koleksiyonlarla çalışır, ancak özellikleri önemli ölçüde farklıdır:
IEnumerable<T>
: Bu arabirim,foreach
döngüsü kullanılarak yinelemeye izin verilen bir dizi öğeyi temsil eder. Salt okunurdur; öğeleri doğrudan ekleyemez, kaldıramaz veya değiştiremezsiniz. Öğeleri rastgele erişim veya değiştirme gerektirmeden sıralı olarak işlemeniz gereken senaryolar için idealdir.List<T>
: Dinamik boyutlu bir diziyi temsil eden somut bir sınıf. Öğeleri eklemek, kaldırmak, eklemek ve dizine göre erişmek için yöntemler sunar. Değiştirme için esneklik sağlar ancak tüm koleksiyonu bellekte sakladığı için daha fazla bellek tüketir.
IEnumerable<T>
öğesini List<T>
öğesine Ne Zaman Dönüştürülmeli?
Dönüştürme şu durumlarda gereklidir:
- Rastgele erişim:
List<T>
,IEnumerable<T>
’nin aksine doğrudan erişime (örneğin,myList[5]
) izin verir. - Koleksiyon değiştirme:
List<T>
, öğe ekleme, kaldırma ve eklemeyi destekler. - Çoklu yineleme: Kaynağın tekrarlanan numaralandırılmasını önleyerek,
List<T>
’ye dönüştürme çoklu yinelemeler için daha verimli olabilir. - Yöntem gereksinimleri: Bazı yöntemler veya kütüphaneler giriş olarak
List<T>
bekler.
ToList()
Yöntemini Kullanma
En verimli ve önerilen yaklaşım, ToList()
LINQ genişletme yöntemini kullanmaktır:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = numbers.ToList();
List<T>
Oluşturucusunu Kullanma
List<T>
oluşturucusu ayrıca bir IEnumerable<T>
kabul eder:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>(numbers);
Bu, ToList()
ile işlevsel olarak eşdeğerdir.
LINQ Sorgusu Sözdizimini Kullanma
Mümkün olsa da, LINQ sorgu sözdizimi daha az özlü ve verimlidir:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = (from number in numbers select number).ToList();
foreach
Döngüsünü Kullanma
Bu, dönüştürme sırasında bireysel öğe işlemesini gerektiren belirli senaryolar için uygun olan en az verimli yöntemdir:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>();
foreach (int number in numbers)
{
numberList.Add(number);
}
Özel Genişletme Yöntemleri Oluşturma
Özel dönüşümler için özel genişletme yöntemleri oluşturun. Örneğin:
public static class MyExtensions
{
public static List<T> ToListAndSort<T>(this IEnumerable<T> source) where T : IComparable<T>
{
List<T> list = source.ToList();
list.Sort();
return list;
}
}
Sonuç
ToList()
yöntemi, C#’ta IEnumerable<T>
öğesini List<T>
öğesine dönüştürmek için en uygun seçimdir. Belirli bir nedeniniz olmadıkça diğer yöntemler daha az verimli veya daha az okunabilirdir. Büyük veri kümeleriyle çalışırken her zaman bellek etkilerini göz önünde bulundurun.