Eğitim
Modül
C# dilinde yardımcı yöntemleri kullanarak diziler üzerinde işlemler gerçekleştirme - Training
Dizilerde ters, yeniden boyutlandırma, bölme ve birleştirme işlemleri gerçekleştirmek için C# yardımcı yöntemlerini kullanın.
Bu tarayıcı artık desteklenmiyor.
En son özelliklerden, güvenlik güncelleştirmelerinden ve teknik destekten faydalanmak için Microsoft Edge’e yükseltin.
Benzer veriler genellikle koleksiyon olarak depolandığında ve işlendiğinde daha verimli bir şekilde işlenebilir. Bir koleksiyondaki System.ArraySystem.Collectionstek tek öğeleri veya bir dizi öğeyi eklemek, kaldırmak ve System.Collections.Immutable değiştirmek için , System.Collections.Generic, System.Collections.Concurrentve ad alanındaki sınıfı veya sınıfları kullanabilirsiniz.
İki ana koleksiyon türü vardır; genel koleksiyonlar ve genel olmayan koleksiyonlar. Derleme zamanında genel koleksiyonlar tür açısından güvenlidir. Bu nedenle genel koleksiyonlar genellikle daha iyi performans sunar. Genel koleksiyonlar, oluşturulurken bir tür parametresi kabul ederler ve koleksiyona öğe eklerken veya koleksiyondan Object öğe kaldırırken türe ve türe dönüştürmenizi gerektirmez. Ayrıca, çoğu genel koleksiyon Windows Store uygulamalarında desteklenir. Genel olmayan koleksiyonlar öğeleri olarak Objectdepolar, atama gerektirir ve çoğu Windows Store uygulaması geliştirme için desteklenmez. Ancak, eski kodda genel olmayan koleksiyonlar görebilirsiniz.
.NET Framework 4'ten başlayarak, ad alanı içindeki System.Collections.Concurrent koleksiyonlar birden çok iş parçacığından koleksiyon öğelerine erişmek için verimli iş parçacığı güvenli işlemler sağlar. ad alanındaki System.Collections.Immutable sabit koleksiyon sınıfları (NuGet paketi), işlemler özgün koleksiyonun bir kopyası üzerinde gerçekleştirildiğinden ve özgün koleksiyon değiştirilemediğinden doğal olarak iş parçacığı açısından güvenlidir.
Tüm koleksiyonlar koleksiyondaki öğeleri eklemek, kaldırmak veya bulmak için yöntemler sağlar. Ayrıca, arabirimi veya arabirimi doğrudan veya dolaylı olarak uygulayan ICollection tüm koleksiyonlar ICollection<T> şu özellikleri paylaşır:
Koleksiyonu listeleme özelliği
.NET koleksiyonları, koleksiyonun yinelemesini sağlamak için veya System.Collections.Generic.IEnumerable<T> uygularSystem.Collections.IEnumerable. Numaralandırıcı, koleksiyondaki herhangi bir öğe için taşınabilir bir işaretçi olarak düşünülebilir. foreach, in deyimi ve For Each... Next Deyimi, yöntemi tarafından kullanıma sunulan numaralandırıcıyı GetEnumerator kullanır ve numaralandırıcıyı düzenlemenin karmaşıklığını gizler. Ayrıca, uygulayan tüm koleksiyonlar System.Collections.Generic.IEnumerable<T>sorgulanabilir bir tür olarak kabul edilir ve LINQ ile sorgulanabilir. LINQ sorguları verilere erişmek için ortak bir desen sağlar. Bunlar genellikle standart foreach
döngülere göre daha kısa ve okunabilirdir ve filtreleme, sıralama ve gruplandırma özellikleri sağlar. LINQ sorguları performansı da artırabilir. Daha fazla bilgi için bkz. LINQ to Objects (C#), LINQ to Objects (Visual Basic), Paralel LINQ (PLINQ), LINQ Sorgularına Giriş (C#)ve Temel Sorgu İşlemleri (Visual Basic).
Koleksiyon içeriğini bir diziye kopyalama özelliği
Tüm koleksiyonlar CopyTo yöntemi kullanılarak bir diziye kopyalanabilir; ancak, yeni dizideki öğelerin sırası, numaralandırıcının bunları döndürdüğü sırayı temel alır. Sonuçta elde edilen dizi her zaman sıfır alt sınırına sahip bir boyutludur.
Ayrıca, birçok koleksiyon sınıfı aşağıdaki özellikleri içerir:
Kapasite ve Sayı özellikleri
Koleksiyonun kapasitesi, içerebileceği öğe sayısıdır. Koleksiyonun sayısı, gerçekte içerdiği öğelerin sayısıdır. Bazı koleksiyonlar kapasiteyi, sayıyı veya her ikisini gizler.
Geçerli kapasiteye ulaşıldığında çoğu koleksiyon otomatik olarak kapasitede genişler. Bellek yeniden ayrılır ve öğeler eski koleksiyondan yenisine kopyalanır. Bu, koleksiyonu kullanmak için gereken kodu azaltır; ancak koleksiyonun performansı olumsuz etkilenebilir. Örneğin, değerinden List<T>Capacityküçükse Count için öğe eklemek bir O(1) işlemidir. Yeni öğeye uyum sağlamak için kapasitenin artırılması gerekiyorsa, bir öğe eklemek bir O(n
) işlemine dönüşür ve burada n
olur Count. Birden çok yeniden yüklemenin neden olduğu düşük performansı önlemenin en iyi yolu, ilk kapasiteyi koleksiyonun tahmini boyutu olacak şekilde ayarlamaktır.
A BitArray özel bir durumdur; kapasitesi, sayısıyla aynı olan uzunluğuyla aynıdır.
Tutarlı bir alt sınır
Bir koleksiyonun alt sınırı, ilk öğesinin dizinidir. Ad alanları içindeki System.Collections tüm dizinlenmiş koleksiyonlar sıfır alt sınırına sahiptir ve bu da 0 dizinli oldukları anlamına gelir. Arrayvarsayılan olarak sıfır alt sınırına sahiptir, ancak kullanılarak Array.CreateInstanceArray sınıfının bir örneği oluşturulurken farklı bir alt sınır tanımlanabilir.
Birden çok iş parçacığından erişim için eşitleme (System.Collections yalnızca sınıflar).
Ad alanında System.Collections genel olmayan koleksiyon türleri eşitleme ile bazı iş parçacığı güvenliği sağlar; genellikle ve IsSynchronized üyeleri aracılığıyla SyncRoot kullanıma sunulur. Bu koleksiyonlar varsayılan olarak iş parçacığı açısından güvenli değildir. Bir koleksiyona ölçeklenebilir ve verimli çok iş parçacıklı erişim gerekiyorsa, ad alanında System.Collections.Concurrent sınıflardan birini kullanın veya sabit bir koleksiyon kullanmayı göz önünde bulundurun. Daha fazla bilgi için bkz. thread-Kasa Koleksiyonları.
Genel olarak, genel koleksiyonlar kullanmanız gerekir. Aşağıdaki tabloda bazı yaygın koleksiyon senaryoları ve bu senaryolar için kullanabileceğiniz koleksiyon sınıfları açıklanmaktadır. Genel koleksiyonlarda yeniyseniz, bu tablo göreviniz için en uygun genel koleksiyonu seçmenize yardımcı olur.
İstiyorum... | Genel koleksiyon seçenekleri | Genel olmayan koleksiyon seçenekleri | İş parçacığı güvenli veya sabit koleksiyon seçenekleri |
---|---|---|---|
Anahtara göre hızlı arama için öğeleri anahtar/değer çiftleri olarak depolama | Dictionary<TKey,TValue> | Hashtable (Anahtarın karma koduna göre düzenlenmiş anahtar/değer çiftleri koleksiyonu.) |
ConcurrentDictionary<TKey,TValue> ReadOnlyDictionary<TKey,TValue> ImmutableDictionary<TKey,TValue> |
Dizine göre öğelere erişme | List<T> | Array ArrayList |
ImmutableList<T> ImmutableArray |
İlk çıkan öğeleri kullanma (FIFO) | Queue<T> | Queue | ConcurrentQueue<T> ImmutableQueue<T> |
Verileri Son Çıkan İlk Çıkar (LIFO) kullanma | Stack<T> | Stack | ConcurrentStack<T> ImmutableStack<T> |
Öğelere sırayla erişme | LinkedList<T> | Öneri yok | Öneri yok |
Öğeler kaldırıldığında veya koleksiyona eklendiğinde bildirim alın. (ve uygular INotifyPropertyChangedINotifyCollectionChanged) | ObservableCollection<T> | Öneri yok | Öneri yok |
Sıralanmış koleksiyon | SortedList<TKey,TValue> | SortedList | ImmutableSortedDictionary<TKey,TValue> ImmutableSortedSet<T> |
Matematiksel işlevler için bir küme | HashSet<T> SortedSet<T> |
Öneri yok | ImmutableHashSet<T> ImmutableSortedSet<T> |
Bir koleksiyon sınıfı seçerken, performansta olası dezavantajları göz önünde bulundurmaya değer. Çeşitli değiştirilebilir koleksiyon türlerinin algoritmik karmaşıklıkta karşılık gelen sabit karşılıklarıyla karşılaştırmasına başvurmak için aşağıdaki tabloyu kullanın. Sabit koleksiyon türleri genellikle daha az performans gösterir ancak değişmezlik sağlar. Bu genellikle geçerli bir karşılaştırmalı avantajdır.
Değiştirilebilir | İtfa edilen | En Kötü Durum | Sabit | Karmaşıklık |
---|---|---|---|---|
Stack<T>.Push |
O(1) | O(n ) |
ImmutableStack<T>.Push |
O(1) |
Queue<T>.Enqueue |
O(1) | O(n ) |
ImmutableQueue<T>.Enqueue |
O(1) |
List<T>.Add |
O(1) | O(n ) |
ImmutableList<T>.Add |
O(günlük n ) |
List<T>.Item[Int32] |
O(1) | O(1) | ImmutableList<T>.Item[Int32] |
O(günlük n ) |
List<T>.Enumerator |
O(n ) |
O(n ) |
ImmutableList<T>.Enumerator |
O(n ) |
HashSet<T>.Add Arama |
O(1) | O(n ) |
ImmutableHashSet<T>.Add |
O(günlük n ) |
SortedSet<T>.Add |
O(günlük n ) |
O(n ) |
ImmutableSortedSet<T>.Add |
O(günlük n ) |
Dictionary<T>.Add |
O(1) | O(n ) |
ImmutableDictionary<T>.Add |
O(günlük n ) |
Dictionary<T> Arama |
O(1) | O(1) – veya kesinlikle O(n ) |
ImmutableDictionary<T> Arama |
O(günlük n ) |
SortedDictionary<T>.Add |
O(günlük n ) |
O(n günlük n ) |
ImmutableSortedDictionary<T>.Add |
O(günlük n ) |
bir List<T>
döngü veya döngü kullanılarak verimli bir for
foreach
şekilde numaralandırılabilir. Ancak, ImmutableList<T>
dizin oluşturucusunun O(log n
) süresi nedeniyle bir döngü içinde for
kötü bir iş yapar. Bir döngü kullanarak foreach
listelemek ImmutableList<T>
verimlidir çünkü ImmutableList<T>
kullanır gibi List<T>
basit bir dizi yerine verilerini depolamak için bir ikili ağaç kullanır. Bir dizi çok hızlı bir şekilde dizinine eklenebilirken, istenen dizine sahip düğüm bulunana kadar bir ikili ağaç aşağı doğru ilerletilmelidir.
Ayrıca, SortedSet<T>
ile aynı karmaşıklık düzeyine ImmutableSortedSet<T>
sahiptir. Çünkü her ikisi de ikili ağaç kullanıyor. Elbette önemli fark, sabit bir ikili ağaç kullanmasıdır ImmutableSortedSet<T>
. ImmutableSortedSet<T>
Ayrıca mutasyona izin veren bir System.Collections.Immutable.ImmutableSortedSet<T>.Builder sınıf sunduğundan, hem değişmezlik hem de performansa sahip olabilirsiniz.
Başlık | Açıklama |
---|---|
Koleksiyon Sınıfı Seçme | Farklı koleksiyonları açıklar ve senaryonuz için bir koleksiyon seçmenize yardımcı olur. |
Yaygın Olarak Kullanılan Koleksiyon Türleri | , System.Collections.Generic.List<T>ve System.Collections.Generic.Dictionary<TKey,TValue>gibi System.Arrayyaygın olarak kullanılan genel ve genel olmayan koleksiyon türlerini açıklar. |
Genel Koleksiyonlar Ne Zaman Kullanılır? | Genel koleksiyon türlerinin kullanımını açıklar. |
Koleksiyonlar İçinde Karşılaştırmalar ve Sıralamalar | Koleksiyonlarda eşitlik karşılaştırmalarının ve sıralama karşılaştırmalarının kullanımını açıklar. |
Sıralanmış Koleksiyon Türleri | Sıralanmış koleksiyonların performansını ve özelliklerini açıklar |
Hashtable ve Sözlük Koleksiyon Türleri | Genel ve genel olmayan karma tabanlı sözlük türlerinin özelliklerini açıklar. |
İş Parçacığı Kasa Koleksiyonları | birden çok iş parçacığından güvenli ve verimli eşzamanlı erişimi destekleyen ve System.Collections.Concurrent.ConcurrentBag<T> gibi System.Collections.Concurrent.BlockingCollection<T> koleksiyon türlerini açıklar. |
System.Collections.Immutable | Sabit koleksiyonları tanıtır ve koleksiyon türlerine bağlantılar sağlar. |
System.Array System.Collections System.Collections.Concurrent System.Collections.Generic System.Collections.Specialized System.Linq System.Collections.Immutable
Eğitim
Modül
C# dilinde yardımcı yöntemleri kullanarak diziler üzerinde işlemler gerçekleştirme - Training
Dizilerde ters, yeniden boyutlandırma, bölme ve birleştirme işlemleri gerçekleştirmek için C# yardımcı yöntemlerini kullanın.