Koleksiyonlar OOP'ta önemli bir kavramdır ve C# koleksiyonlarına tam destek dilin en iyilerinden biridir.
Neden genel setler kullanılıyor? C# 2.0'dan önce koleksiyonlar iki ana şekilde uygulanabiliyordu: a. ArrayList kullanın Nesneleri doğrudan ArrayList'e koymak sezgisel olsa da, koleksiyondaki öğeler Object türünde olduğu için her kullandığınızda zahmetli bir tür dönüştürme yapmak zorundasınız. b. Özel koleksiyon sınıfları kullanın Yaygın bir uygulama, CollectionBase soyut sınıfından özel bir sınıf devralmak ve IList nesnesini kapsülleyerek güçlü bir tür koleksiyonu uygulamaktır. Bu yöntem, her koleksiyon türü için uygun özel bir sınıf yazmayı gerektirir ki bu da çok fazla iştir. Genel koleksiyonların ortaya çıkışı yukarıdaki sorunları iyi çözer ve belirli bir türde bir küme oluşturmak için yalnızca bir kod satırı kullanılabilir. Jenerik nedir? Generikler, C# 2.0'da (C++'da şablon olarak adlandırılır) yeni öğelerdir ve esas olarak benzer problemleri çözmek için kullanılırlar. Bu mekanizma, sınıf adının genel tipe argüman olarak aktarılmasına ve ilgili nesnenin oluşturulmasına olanak tanır. Generikleri (sınıflar, arayüzler, metetnameler, delegeler vb. dahil) şablon olarak düşünmek daha iyi olabilir; burada varyant kısmı argüman olarak iletilen sınıf adıyla değiştirilir ve yeni bir tür tanımı ortaya çıkar. Genel konu nispeten geniş ve burada detaylı analiz etmeyeceğim, ilgilenenler ilgili bilgilere başvurabilir. Genel bir koleksiyon nasıl oluşturabilirim? System.Collections.Generic isim alanı altındaki List genel sınıfı <T>koleksiyonlar oluşturmak için kullanılır ve sözdizimi şu şekildedir: [mw_shl_code=csharp,doğru] List<T> ListOfT = yeni List<T>(); [/mw_shl_code] "T" kullanılacak türdür ve bu türler basit türler olabilir; örneğin string, int veya kullanıcı tarafından tanımlanan türler. Belirli bir örneme bakalım.
Kişi sınıfı şu şekilde tanımlanır: [mw_shl_code=csharp,true]sınıf Kişi
{ özel string _name; İsim özel int _age; Yaş
Bir Kişi nesnesi yarat public Kişi (dize Adı, Yaşı) { this._name= İsim; this._age = Yaş; }
İsim public string Name { get { return _name; } }
Yaş public int Age { get { return _age; } }
}
//创建Person对象 Kişi p1 = yeni Kişi ("Zhang San", 30); Kişi p2 = yeni Kişi ("Li Si", 20); Kişi p3 = yeni Kişi ("Wang Wu", 50);
//创建类型为Person的对象集合 Liste<Person> kişiler = yeni Liste<Person>();
//将Person对象放入集合 kişiler. Add(p1); kişiler. Add(p2); kişiler. Add(p3);
//输出第2个人的姓名 Console.Write(persons[1]. İsim); [/mw_shl_code] Gördüğünüz gibi, genel koleksiyonlar koleksiyonların uygulama kodunu büyük ölçüde basitleştirir; bu sayede belirli türlerde koleksiyonlar kolayca oluşturulabilir. Sadece bu değil, genel koleksiyonlar daha güçlü işlevler de sunuyor, sıralama ve arama süreçlerine bir göz atalım. Genel koleksiyonların sıralanması Sıralama karşılaştırmaya dayanır ve sıralamak için önce karşılaştırma yapmalısınız. Örneğin, eğer iki sayı 1 ve 2 varsa, onları sıralamak için önce bu iki sayıyı karşılaştırmalı ve karşılaştırma sonuçlarına göre sıralamalıyız. Nesneleri karşılaştırmak istiyorsanız, durum biraz daha karmaşıktır; örneğin, Kişi nesnelerini karşılaştırırsanız, isim veya yaş ile karşılaştırabilirsiniz, bu da karşılaştırma kurallarını belirlemeyi gerektirir. Bir nesnenin birden fazla karşılaştırma kuralı olabilir, ancak yalnızca bir varsayılan kuralı vardır ve bu kural nesneyi tanımlayan sınıfa yerleştirilir. Varsayılan karşılaştırma kuralları, IComparable genel arayüzüne ait olan CompareTo yönteminde <T>tanımlanmıştır. Aşağıdaki kodu inceleyin: [mw_shl_code=csharp,true]sınıf Kişi :IComparable<Person>
{ Yaşa göre karşılaştırma public int Karşılaştırma(Kişi p) { Bunu geri ver. Yaş - p.Yaş; } }[/mw_shl_code] CompareTo yönteminin parametreleri aynı türden başka bir nesnedir ve karşılaştırılabilir; dönüş değeri int tipindendir; dönüş değeri 0'dan büyükse, bu birinci nesnenin ikinci nesneden büyük olduğu anlamına gelir; eğer dönüş değeri 0'dan küçükse, birinci nesne ikinci nesneden küçüktür ve 0 döndürürse iki nesne eşittir. Varsayılan karşılaştırma kuralları tanımlandıktan sonra, koleksiyonu parametresiz Sort yöntemiyle aşağıdaki gibi sıralayabilirsiniz: [mw_shl_code=csharp,true]// Koleksiyonu varsayılan kurallara göre sıralayın kişiler. Sort();
//输出所有人姓名 foreach (Kişi p kişi olarak)
{ Console.WriteLine(p.Name); Çıkış sırası "Li Si", "Zhang San" ve "Wang Wu"dur. }[/mw_shl_code] Pratikte, koleksiyonun çeşitli farklı kurallara göre sıralanması genellikle gereklidir; bu da diğer karşılaştırma kurallarının tanımlanmasını gerektirir; bu kurallar IComparer genel arayüzüne ait olan Compare yönteminde <T>tanımlanabilir, lütfen aşağıdaki koda bakınız: [mw_shl_code=csharp,true]sınıf Isim Karşılaştırıcı: IComparer<Person>
{ Depolama sıralayıcı örnekleri public static NameComparer Default = yeni NameComparer();
İsimle karşılaştır public int Karşılaştır (Kişi p1, Kişi p2) { return System.Collections.Comparer.Default.Compare(p1. İsim, p2. İsim); } }[/mw_shl_code] Karşılaştırma yönteminin parametreleri, karşılaştırılması gereken aynı türden iki nesnedir ve döndürme değeri int tipindedir ve dönüş değeri işleme kuralları Karşılaştırma yönteminin kurallarıyla aynıdır. Comparer.Default, aynı türdeki iki nesneyi karşılaştırmak için yerleşik bir Comparer nesnesi döndürür. Bu yeni tanımlanmış karşılaştırıcı ile koleksiyonu nasıl sıralayacağınız şöyle: [mw_shl_code=csharp,true]//Koleksiyonu isme göre sıralayın kişiler. sort(NameComparer.Default);
//输出所有人姓名 foreach (Kişi p kişi olarak)
{ Console.WriteLine(p.Name); Çıkış sırası "Li Si", "Wang Wu" ve "Zhang San"dır. }[/mw_shl_code] Ayrıca, delegenin karşılaştırma kurallarını depolamak için çağıracağı bir yöntem tanımlayarak koleksiyonu sıralayabilirsiniz ve statik bir yöntem kullanabilirsiniz. Aşağıdaki kodu inceleyin: [mw_shl_code=csharp,true]sınıf KişiKarşılaştırma
{ İsimle karşılaştır public static int Adı (Kişi p1, Kişi p2) { return System.Collections.Comparer.Default.Compare(p1. İsim, p2. İsim); } }[/mw_shl_code] Yöntemin parametreleri, karşılaştırılması gereken aynı türden iki nesnedir; döndürme değeri int tipindedir ve dönüş değeri işleme kuralı CompareTo yöntemiyle aynıdır.Sonra koleksiyonu yerleşik genel delege sistemi aracılığıyla sıralayın. <T>Karşılaştırma: [mw_shl_code=csharp,doğru] System.Comparison<Person> NameComparison = yeni System.Comparison<Person>(PersonComparison.Name); kişiler. Sort(NameComparison);
//输出所有人姓名 foreach (Kişi p kişi olarak)
{ Console.WriteLine(p.Name); Çıkış sırası "Li Si", "Wang Wu" ve "Zhang San"dır. }[/mw_shl_code] Son iki yöntemin koleksiyonu belirtilen kurallara göre sıralayabildiği görülebilir, ancak yazar delegasyon yöntemini tercih eder ve çeşitli karşılaştırma kurallarını bir sınıfa koyup sonra esnek olarak çağırmayı düşünebilir. Genel koleksiyonlar için arama Arama, koleksiyondan belirli koşulları karşılayan öğeleri bulmak için yapılır ve ihtiyaç duyulduğunda birden fazla arama koşulu tanımlanabilir ve çağrılabilir. İlk olarak, arama kriterlerini aşağıdaki şekilde tanımlayın: [mw_shl_code=csharp,true]sınıf KişiDöner
{ Orta yaşlı insanları bulun (40 yaş üstü) public static bool Orta Yaş (Kişi p) { if (p.Age >=40) True döner; else yanlış döndür; } }[/mw_shl_code] Yukarıdaki arama kriterleri, Boolean dönüş tipiyle statik bir yöntemle yerleştirilir ve koleksiyondaki belirli koşulları karşılayan öğeler doğru, aksi takdirde yanlış döner.Sonra dahili genel delege System.Predicate üzerinden koleksiyonu arayın<T>: [mw_shl_code=csharp,doğru] System.Predicate<Person> MidAge= yeni System.Predicate<Person>(KişiPredicate.MidAge); <Person> MidAgePersons = kişileri listeleyin. FindAll (Orta Yaş Dalgın);
//输出所有的中年人姓名 foreach (Kişi p, MidAgePersons)
{ Console.WriteLine(p.Name); Çıkış "Wang Wu" }[/mw_shl_code] Genel koleksiyonların genişletilmesi Ya setteki tüm isimlerin isimlerini, virgülle ayrılmış olarak almak istersen? Tek bir sınıfın sağlayabileceği işlevsellik sınırlı olduğundan, List sınıfının genişletilmesini <T>düşünmek doğaldır; bu sınıf da bir sınıftır ve bu nedenle miras yoluyla genişletilebilir. Aşağıdaki kodu inceleyin: [mw_shl_code=csharp,true]// Kişiler koleksiyon sınıfını tanımlayın sınıf Kişiler: Liste<Person>
{ Koleksiyondaki herkesin isimlerini alın public string GetAllNames() { Eğer (bu. Sayı == 0) return "";
val dizisi = """; foreach (Kişi p) { val += p.Name + ","; }
Val'i geri ver. Alt dizi(0, val. Uzunluk - 1); }
}
//创建并填充Persons集合 Kişiler PersonCol = yeni Kişiler(); PersonCol.Add(p1); PersonCol.Add(p2); PersonCol.Add(p3);
//输出所有人姓名 Console.Write(PersonCol.GetAllNames()); Çıkış "Zhang San, Li Si, Wang Wu"[/mw_shl_code] Özet: Bu makale, C# 2.0'da koleksiyonları uygulamak ve toplama fonksiyonunu genişletmek için jenerik türlerin kullanımına odaklanıyor ve genel koleksiyonların doğru kullanımı, işin çok fazla tekrarlanmasını azaltabilir ve geliştirme verimliliğini büyük ölçüde artırabilir. Aslında, setler jenerik türlerin tipik bir uygulamasıdır ve jenerik hakkında daha fazla bilgi edinmek isterseniz, ilgili diğer materyallere başvurabilirsiniz. Umarım bu makale size faydalı olmuştur :-)
|