Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Makale Geçmişi

«« Makaleye geri dön
20.06.16 21:19
LINQ - Gruplama (Grouping) Örnekleri
Bu makalede kullanılan veri kaynağını görmek için tıklayın . GroupBy yöntemi ve group ... by ... into ... cümleciği listedeki elemanları verilen anahtar alana göre (örneğin öğrencileri sınıf bilgilerine göre) gruplayarak oluşturulan gruplar üzerinde işlem yapmamıza imkan sağlar. Gruplandırmada kullanılan alana GrupAdi.Key şeklide ulaşılabilir. Basit GroupBy Örneği 1 Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları sınıflarına göre gruplandırır ve sınıf gruplarındaki anahtar alan (sınıf alanı) ve sınıf gruplarındaki kayıt sayısı bilgileri ile isimsiz tip oluşturup seçer. Daha sonra bu tiplerden oluşturduğu listeyi çıktıya yazar. var Ogrenciler = OgrencileriGetir(); var Siniflar = from Ogrenci in Ogrenciler orderby Ogrenci.Sinif group Ogrenci by Ogrenci.Sinif into Sinifi select new { Sinif = Sinifi.Key, OgrenciSayisi = Sinifi.Count() }; Console.WriteLine("Sınıf öğrenci sayıları :"); foreach (var Satir in Siniflar) { Console.WriteLine("{0}. sınıfta {1} öğrenci var.", Satir.Sinif, Satir.OgrenciSayisi); } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Sınıf öğrenci sayıları : 1. sınıfta 3 öğrenci var. 2. sınıfta 5 öğrenci var. 3. sınıfta 5 öğrenci var. 4. sınıfta 4 öğrenci var. Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir(); var Siniflar = Ogrenciler.OrderBy(Ogrenci => Ogrenci.Sinif) .GroupBy(Ogrenci => Ogrenci.Sinif) .Select(Sinif => new { Sinif = Sinif.Key, OgrenciSayisi = Sinif.Count() }); Console.WriteLine("Sınıf öğrenci sayıları :"); foreach (var Satir in Siniflar) { Console.WriteLine("{0}. sınıfta {1} öğrenci var.", Satir.Sinif, Satir.OgrenciSayisi); } Console.ReadLine(); Basit GroupBy Örneği 2 Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları sıraladıktan sonra (gruplamanın daha hızlı yapılmasına yardımcı olabilir) sınıflarına göre gruplandırır, bu grupları seçerek ve sınıf gruplarından yeni bir grup listesi oluşturur. Daha sonra iç içe foreach döngüleri ile dıştaki foreach döngüsünde grupların anahtar alanlarını ve içerdeki foreach döngüsünde gruplardaki öğrencileri çıktıya yazar. var Ogrenciler = OgrencileriGetir(); var Siniflar = from Ogrenci in Ogrenciler orderby Ogrenci.Sinif group Ogrenci by Ogrenci.Sinif into SinifGrubu select SinifGrubu; Console.WriteLine("Sınıflardaki öğrenciler..."); foreach (var BirSiniftakiler in Siniflar) { Console.WriteLine("{0}. sınıftaki öğrenciler :", BirSiniftakiler.Key); foreach (var Ogrenci in BirSiniftakiler) { Console.WriteLine("{0} {1}", Ogrenci.Adi, Ogrenci.Soyadi); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Sınıflardaki öğrenciler... 1. sınıftaki öğrenciler : Tekin Uğurlu Kenan Oran Erhan Erkanlı 2. sınıftaki öğrenciler : Ahmet Geçe Hale Birinci Ayşe Hanım Nuri Babayiğit Erhan Fidan 3. sınıftaki öğrenciler : Jale İkinci Fatma Teyze Cevdet Döğer Lale Üçüncü Erhan Çelik 4. sınıftaki öğrenciler : Tuncay Çağrı Mesut Bahtiyar Veli Canlı Mehmet Emre Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir(); var Siniflar = Ogrenciler.OrderBy(Ogrenci => Ogrenci.Sinif).GroupBy(Ogrenci => Ogrenci.Sinif); Console.WriteLine("Sınıflardaki öğrenciler..."); foreach (var BirSiniftakiler in Siniflar) { Console.WriteLine("{0}. sınıftaki öğrenciler :", BirSiniftakiler.Key); foreach (var Ogrenci in BirSiniftakiler) { Console.WriteLine("{0} {1}", Ogrenci.Adi, Ogrenci.Soyadi); } } Console.ReadLine(); Basit GroupBy Örneği 3 Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları başarı durumuna göre gruplandırır ( Ogrenci.Ortalama >= 55   işleminin sonucu " true " ve " false " olanları iki grup şeklinde), bu grupları seçerek başarı gruplarından yeni bir grup listesi oluşturur. Daha sonra iç içe foreach döngüleri ile dıştaki foreach döngüsünde grupların anahtar alanlarına bakarak belirlediği bir değeri (örnekte "başarılı" ve "başarısız" metinlerini) ve içerdeki foreach döngüsünde gruplardaki öğrencileri çıktıya yazar. var Ogrenciler = OgrencileriGetir(); var Siniflar = from Ogrenci in Ogrenciler orderby Ogrenci.Sinif group Ogrenci by Ogrenci.Ortalama >= 55 into BasariGrubu select BasariGrubu; Console.WriteLine("Öğrencilerin Başarı Durumları..."); foreach (var BasariGrubu in Siniflar) { Console.WriteLine("\n- {0} öğrenciler :", BasariGrubu.Key ? "Başarılı" : "Başarısız"); foreach (var Ogrenci in BasariGrubu) { Console.WriteLine("{0} {1} -> {2:0.00}", Ogrenci.Adi, Ogrenci.Soyadi, Ogrenci.Ortalama); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Öğrencilerin Başarı Durumları... - Başarısız öğrenciler : Tekin Uğurlu -> 30,00 Hale Birinci -> 25,00 Cevdet Döğer -> 16,25 Lale Üçüncü -> 16,67 Mesut Bahtiyar -> 36,67 Veli Canlı -> 43,33 - Başarılı öğrenciler : Kenan Oran -> 66,67 Erhan Erkanlı -> 90,00 Ahmet Geçe -> 76,67 Ayşe Hanım -> 80,00 Nuri Babayiğit -> 65,00 Erhan Fidan -> 86,25 Jale İkinci -> 97,00 Fatma Teyze -> 89,25 Erhan Çelik -> 78,33 Tuncay Çağrı -> 73,33 Mehmet Emre -> 66,33 Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir(); var Siniflar = Ogrenciler.GroupBy(Ogrenci => Ogrenci.Ortalama >= 55); Console.WriteLine("Öğrencilerin Başarı Durumları..."); foreach (var BasariGrubu in Siniflar) { Console.WriteLine("\n- {0} öğrenciler :", BasariGrubu.Key ? "Başarılı" : "Başarısız"); foreach (var Ogrenci in BasariGrubu) { Console.WriteLine("{0} {1} -> {2:0.00}", Ogrenci.Adi, Ogrenci.Soyadi, Ogrenci.Ortalama); } } Console.ReadLine(); Yuvalanmış (Nested) GroupBy Örneği Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları sınıflarına göre gruplandırır. Oluşturduğu sınıf gruplarının anahtarları (sınıf bilgisi) ve sınıf grubu içinde ikinci bir gruplandırma ile öğrencileri cinsiyetine göre ayırdığı bir alt gruplandırma ile oluşturduğu isimsiz tipleri seçer. Oluşan grup listesindeki grupları ve gruplardaki öğrencilerin numara ad ve soyadlarını iç içe foreach döngüleri kullanarak çıktıya yazar. var Ogrenciler = OgrencileriGetir(); var CinsiyeteGoreSinifListeleri = from Ogrenci in Ogrenciler orderby Ogrenci.No group Ogrenci by Ogrenci.Sinif into SinifGrubu select new { SinifNo = SinifGrubu.Key, SinifOgrencileri = from BuSiniftakiOgrenci in SinifGrubu orderby BuSiniftakiOgrenci.Cinsiyet group BuSiniftakiOgrenci by BuSiniftakiOgrenci.Cinsiyet into SinifCinsiyetGrubu select SinifCinsiyetGrubu }; Console.WriteLine("Cinsiyete Göre Gruplanmış Sınıf Öğrenci Listeleri..."); foreach (var Sinif in CinsiyeteGoreSinifListeleri) { Console.WriteLine("\n{0}. sınıf öğrencileri :", Sinif.SinifNo); foreach (var OgrenciGrubu in Sinif.SinifOgrencileri) { Console.WriteLine("{0} öğrenciler:", OgrenciGrubu.Key); foreach (var Ogrenci in OgrenciGrubu) { Console.WriteLine("{0} - {1} {2}", Ogrenci.No, Ogrenci.Adi, Ogrenci.Soyadi); } } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Cinsiyete Göre Gruplanmış Sınıf Öğrenci Listeleri... 2. sınıf öğrencileri : Bayan öğrenciler: 3 - Hale Birinci 13 - Ayşe Hanım Erkek öğrenciler: 1 - Nuri Babayiğit 6 - Ahmet Geçe 16 - Erhan Fidan 4. sınıf öğrencileri : Erkek öğrenciler: 2 - Tuncay Çağrı 8 - Mesut Bahtiyar 12 - Veli Canlı 14 - Mehmet Emre 3. sınıf öğrencileri : Bayan öğrenciler: 4 - Jale İkinci 9 - Lale Üçüncü 15 - Fatma Teyze Erkek öğrenciler: 11 - Cevdet Döğer 17 - Erhan Çelik 1. sınıf öğrencileri : Erkek öğrenciler: 5 - Kenan Oran 7 - Tekin Uğurlu 10 - Erhan Erkanlı Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir(); var CinsiyeteGoreSinifListeleri = Ogrenciler.OrderBy(Ogrenci => Ogrenci.No) .GroupBy(Ogrenci => Ogrenci.Sinif) .Select(SinifGrubu => new { SinifNo = SinifGrubu.Key, SinifOgrencileri = SinifGrubu.OrderBy(BuSiniftakiOgrenci => BuSiniftakiOgrenci.Cinsiyet) .GroupBy(BuSiniftakiOgrenci => BuSiniftakiOgrenci.Cinsiyet) }); Console.WriteLine("Cinsiyete Göre Gruplanmış Sınıf Öğrenci Listeleri..."); foreach (var Sinif in CinsiyeteGoreSinifListeleri) { Console.WriteLine("\n{0}. sınıf öğrencileri :", Sinif.SinifNo); foreach (var OgrenciGrubu in Sinif.SinifOgrencileri) { Console.WriteLine("{0} öğrenciler:", OgrenciGrubu.Key); foreach (var Ogrenci in OgrenciGrubu) { Console.WriteLine("{0} - {1} {2}", Ogrenci.No, Ogrenci.Adi, Ogrenci.Soyadi); } } } Console.ReadLine(); Karşılaştırıcı Kullanan GroupBy Örnekleri : GroupBy , bir karşılaştırıcı ile kullanılabilir. Karşılaştırıcı, IEqualityComparer arayüzünü uygulayan, Equals ve GetHashCode isimli iki metoda sahip bir sınıftır. IEqualityComparer 'in Equals yöntemi, grupları birbirinden ayıracak, gelen iki parametrenin eşit olup olmadığını döndüren bir yöntemdir. Biz örneğimizde hem cinsiyeti, hem de başarı durumu farklı olanların farklı gruplar olduğunu bildiren bir kod yazdık. IEqualityComparer 'in GetHashCode   yöntemi ise, verileri birbirinden ayırmak için kullanılacak HashCode adı verilen bir kod üretir. Bu kodun hangi verilerden üretileceğini bu yöntem içinde biz belirtiriz. GroupBy da kayıtları birbirinden ayırmak için bu yöntemi çağırır. HashCode , sınıfların birbirinden ayıracak özel bir sayıdır (32 bit bir tamsayıdır). Sınıfların GetHashCode yöntemi ile elde edilebilir. Bu kod özel bir algoritma ile üretilir ve verileri karşılaştırmada kullanılır ancak her sınıfın HasCode değerinin farklı olacağının bir garantisi yoktur. Karşılaştırıcı Kullanarak GroupBy Örneği Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları karşılaştırıcı sınıfı kullanarak başarı durumları ve cinsiyetlerine göre gruplandırır (Başarılı erkekler, başarısız erkekler, başarılı bayanlar ve başarısız bayanlar). İç içe 2 döngü kullanarak grupların bilgilerini ve gruplardaki öğrencilerin ad, soyad ve ortalama bilgilerini çıktıya yazar. var Ogrenciler = OgrencileriGetir(); var CinsiyeteGoreBasariListesi = Ogrenciler.GroupBy(Ogrenci => Ogrenci, new CinsiyeteGoreBasariKarsilastirici()); Console.WriteLine("Cinsiyete göre başarı durumları listesi..."); foreach (var OgrenciGrubu in CinsiyeteGoreBasariListesi) { Console.WriteLine("\n{0} {1} :", OgrenciGrubu.Key.Basarili ? "Başarılı" : "Başarısız", OgrenciGrubu.Key.Cinsiyet == "Erkek" ? "erkekler" : "bayanlar"); foreach (var Ogrenci in OgrenciGrubu) { Console.WriteLine("{0} {1}. Ortalaması {2:0.00}", Ogrenci.Adi, Ogrenci.Soyadi, Ogrenci.Ortalama); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Cinsiyete göre başarı durumları listesi... Başarılı erkekler : Tuncay Çağrı. Ortalaması 73,33 Ahmet Geçe. Ortalaması 76,67 Mehmet Emre. Ortalaması 66,33 Nuri Babayiğit. Ortalaması 65,00 Kenan Oran. Ortalaması 66,67 Erhan Erkanlı. Ortalaması 90,00 Erhan Fidan. Ortalaması 86,25 Erhan Çelik. Ortalaması 78,33 Başarılı bayanlar : Jale İkinci. Ortalaması 97,00 Fatma Teyze. Ortalaması 89,25 Ayşe Hanım. Ortalaması 80,00 Başarısız erkekler : Tekin Uğurlu. Ortalaması 30,00 Mesut Bahtiyar. Ortalaması 36,67 Veli Canlı. Ortalaması 43,33 Cevdet Döğer. Ortalaması 16,25 Başarısız bayanlar : Hale Birinci. Ortalaması 25,00 Lale Üçüncü. Ortalaması 16,67 Örnekte kullanılan karşılaştırıcı sınıf şöyledir : public class CinsiyeteGoreBasariKarsilastirici : IEqualityComparer { public bool Equals(Kayit x, Kayit y) { if (x.Cinsiyet != y.Cinsiyet && x.Basarili != y.Basarili) return false; return true; } public int GetHashCode(Kayit Ogrenci) { return Ogrenci.Basarili.GetHashCode() + Ogrenci.Cinsiyet.GetHashCode(); } } Karşılaştırıcı Kullanarak Haritalanmış (Mapped) GroupBy Örneği Örneğimiz, bir dizideki anagramları (aynı harflerle yazılan kelimeler) bulmaktadır. Karşılaştırıcı sınıfta kelimelerin anagram olup olmadıklarını belirleyen " SiraliKarakterleriVer " isimli özel bir yöntem kullanıldı. Bu yöntem parametre olarak verilen kelimedeki harfleri alfabetik sıraya sokmaktadır. Anagram kelimelerin harflerinin alfabetik sırası aynı olacağından bu yöntem sayesinde anagram kelimeler karşılaştırılabilmektedir. Bu örnek dizideki anagramları bulur ve gruplandırır. Daha sonra bu anagram gruplarını çıktıya yazar. string[] Anagramlar = { "şart", "yumak", "antik", "traş", "yamuk", "nakit" }; var AnagramGruplari = Anagramlar.GroupBy(Kelime => Kelime, new AnagramEsitlikKarsilastirici()); Console.WriteLine("Dizideki anagramlar :"); foreach (var Grup in AnagramGruplari) { Console.WriteLine("---"); foreach (var Kelime in Grup) { Console.WriteLine(Kelime); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Dizideki anagramlar : --- şart traş --- yumak yamuk --- antik nakit Dizide kullanılan karşılaştırıcı sınıf şöyledir: public class AnagramEsitlikKarsilastirici : IEqualityComparer { public bool Equals(string x, string y) { return SiraliKarakterleriVer(x) == SiraliKarakterleriVer(y); } public int GetHashCode(string obj) { return SiraliKarakterleriVer(obj).GetHashCode(); } private string SiraliKarakterleriVer(string Kelime) { char[] KelimeninKarakterleri = Kelime.ToCharArray(); Array.Sort(KelimeninKarakterleri); return new string(KelimeninKarakterleri); } } Kaynak: https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b Diğer LINQ Makaleleri: LINQ Örnekleri makalelerinde kullanılan verikaynağı LINQ (Language Integrated Query - Dile Entegre Edilmiş Sorgu) Nedir? LINQ Sağlayıcıları (LINQ Providers) LINQ Yöntem Sözdizimi (LINQ Method Syntax) LINQ - Temel İşlemler - Bir Veri Kaynağı Bildirme ve Seçme (From ve Select) LINQ - Temel İşlemler - Süzme (Filtering) LINQ - Temel İşlemler - Sıralama (Ordering) LINQ - Temel İşlemler - Gruplama (Grouping) LINQ - Temel İşlemler - Birleştirme (Joining) LINQ - Deferred Execution - Ertelenmiş Çalıştırma LINQ - Immediate Execution - Anında Çalıştırma LINQ - Query Reuse - Sorgunun Yeniden Kullanımı LINQ - Kısıtlama (Restriction) Kullanım Örnekleri LINQ - Yansıtma (Projection) - Select Kullanım Örnekleri LINQ - Yansıtma (Projection) - SelectMany Kullanım Örnekleri LINQ - Bölümleme (Partitioning) Örnekleri LINQ - Sıralama (Ordering) Örnekleri LINQ - Gruplama (Grouping) Örnekleri  (Bu makale) LINQ - Küme (Set) Örnekleri LINQ - Dönüşüm (Conversion) Örnekleri LINQ - Eleman (Element) Seçimi Örnekleri LINQ - Oluşturma (Generation) Örnekleri LINQ - Miktar Belirleyiciler (Quantifiers) Örnekleri LINQ - Yığın (Aggregate) Örnekleri LINQ - Birleştirme (Join) İşlemleri LINQ - Özel Dizilim (Custom Sequence) Örneği LINQ - Concat ve SequenceEqual İle Örnekle r
Ekleyen: canora
Değiştiren: canora
10.04.16 22:14
LINQ - Gruplama (Grouping) Örnekleri
Bu makalede kullanılan veri kaynağını görmek için tıklayın . GroupBy yöntemi ve group ... by ... into ... cümleciği listedeki elemanları verilen anahtar alana göre (örneğin öğrencileri sınıf bilgilerine göre) gruplayarak oluşturulan gruplar üzerinde işlem yapmamıza imkan sağlar. Gruplandırmada kullanılan alana GrupAdi.Key şeklide ulaşılabilir. Basit GroupBy Örneği 1 Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları sınıflarına göre gruplandırır ve sınıf gruplarındaki anahtar alan (sınıf alanı) ve sınıf gruplarındaki kayıt sayısı bilgileri ile isimsiz tip oluşturup seçer. Daha sonra bu tiplerden oluşturduğu listeyi çıktıya yazar. var Ogrenciler = OgrencileriGetir (); var Siniflar = from Ogrenci in Ogrenciler orderby Ogrenci . Sinif group Ogrenci by Ogrenci . Sinif into Sinifi select new { Sinif = Sinifi . Key , OgrenciSayisi = Sinifi . Count () }; Console . WriteLine ( "Sınıf öğrenci sayıları :" ); foreach ( var Satir in Siniflar ) { Console . WriteLine ( "{0}. sınıfta {1} öğrenci var." , Satir . Sinif , Satir . OgrenciSayisi ); } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Sınıf öğrenci sayıları : 1. sınıfta 3 öğrenci var. 2. sınıfta 5 öğrenci var. 3. sınıfta 5 öğrenci var. 4. sınıfta 4 öğrenci var. Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir (); var Siniflar = Ogrenciler . OrderBy ( Ogrenci => Ogrenci . Sinif ) . GroupBy ( Ogrenci => Ogrenci . Sinif ) . Select ( Sinif => new { Sinif = Sinif . Key , OgrenciSayisi = Sinif . Count () }); Console . WriteLine ( "Sınıf öğrenci sayıları :" ); foreach ( var Satir in Siniflar ) { Console . WriteLine ( "{0}. sınıfta {1} öğrenci var." , Satir . Sinif , Satir . OgrenciSayisi ); } Console.ReadLine(); Basit GroupBy Örneği 2 Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları sıraladıktan sonra (gruplamanın daha hızlı yapılmasına yardımcı olabilir) sınıflarına göre gruplandırır, bu grupları seçerek ve sınıf gruplarından yeni bir grup listesi oluşturur. Daha sonra iç içe foreach döngüleri ile dıştaki foreach döngüsünde grupların anahtar alanlarını ve içerdeki foreach döngüsünde gruplardaki öğrencileri çıktıya yazar. var Ogrenciler = OgrencileriGetir (); var Siniflar = from Ogrenci in Ogrenciler orderby Ogrenci . Sinif group Ogrenci by Ogrenci . Sinif into SinifGrubu select SinifGrubu ; Console . WriteLine ( "Sınıflardaki öğrenciler..." ); foreach ( var BirSiniftakiler in Siniflar ) { Console . WriteLine ( "{0}. sınıftaki öğrenciler :" , BirSiniftakiler . Key ); foreach ( var Ogrenci in BirSiniftakiler ) { Console . WriteLine ( "{0} {1}" , Ogrenci . Adi , Ogrenci . Soyadi ); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Sınıflardaki öğrenciler... 1. sınıftaki öğrenciler : Tekin Uğurlu Kenan Oran Erhan Erkanlı 2. sınıftaki öğrenciler : Ahmet Geçe Hale Birinci Ayşe Hanım Nuri Babayiğit Erhan Fidan 3. sınıftaki öğrenciler : Jale İkinci Fatma Teyze Cevdet Döğer Lale Üçüncü Erhan Çelik 4. sınıftaki öğrenciler : Tuncay Çağrı Mesut Bahtiyar Veli Canlı Mehmet Emre Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir (); var Siniflar = Ogrenciler . OrderBy ( Ogrenci => Ogrenci . Sinif ). GroupBy ( Ogrenci => Ogrenci . Sinif ); Console . WriteLine ( "Sınıflardaki öğrenciler..." ); foreach ( var BirSiniftakiler in Siniflar ) { Console . WriteLine ( "{0}. sınıftaki öğrenciler :" , BirSiniftakiler . Key ); foreach ( var Ogrenci in BirSiniftakiler ) { Console . WriteLine ( "{0} {1}" , Ogrenci . Adi , Ogrenci . Soyadi ); } } Console.ReadLine(); Basit GroupBy Örneği 3 Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları başarı durumuna göre gruplandırır ( Ogrenci.Ortalama >= 55   işleminin sonucu " true " ve " false " olanları iki grup şeklinde), bu grupları seçerek başarı gruplarından yeni bir grup listesi oluşturur. Daha sonra iç içe foreach döngüleri ile dıştaki foreach döngüsünde grupların anahtar alanlarına bakarak belirlediği bir değeri (örnekte "başarılı" ve "başarısız" metinlerini) ve içerdeki foreach döngüsünde gruplardaki öğrencileri çıktıya yazar. var Ogrenciler = OgrencileriGetir (); var Siniflar = from Ogrenci in Ogrenciler orderby Ogrenci . Sinif group Ogrenci by Ogrenci . Ortalama >= 55 into BasariGrubu select BasariGrubu ; Console . WriteLine ( "Öğrencilerin Başarı Durumları..." ); foreach ( var BasariGrubu in Siniflar ) { Console . WriteLine ( "\n- {0} öğrenciler :" , BasariGrubu . Key ? "Başarılı" : "Başarısız" ); foreach ( var Ogrenci in BasariGrubu ) { Console . WriteLine ( "{0} {1} -> {2:0.00}" , Ogrenci . Adi , Ogrenci . Soyadi , Ogrenci . Ortalama ); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Öğrencilerin Başarı Durumları... - Başarısız öğrenciler : Tekin Uğurlu -> 30,00 Hale Birinci -> 25,00 Cevdet Döğer -> 16,25 Lale Üçüncü -> 16,67 Mesut Bahtiyar -> 36,67 Veli Canlı -> 43,33 - Başarılı öğrenciler : Kenan Oran -> 66,67 Erhan Erkanlı -> 90,00 Ahmet Geçe -> 76,67 Ayşe Hanım -> 80,00 Nuri Babayiğit -> 65,00 Erhan Fidan -> 86,25 Jale İkinci -> 97,00 Fatma Teyze -> 89,25 Erhan Çelik -> 78,33 Tuncay Çağrı -> 73,33 Mehmet Emre -> 66,33 Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir (); var Siniflar = Ogrenciler . GroupBy ( Ogrenci => Ogrenci . Ortalama >= 55 ); Console . WriteLine ( "Öğrencilerin Başarı Durumları..." ); foreach ( var BasariGrubu in Siniflar ) { Console . WriteLine ( "\n- {0} öğrenciler :" , BasariGrubu . Key ? "Başarılı" : "Başarısız" ); foreach ( var Ogrenci in BasariGrubu ) { Console . WriteLine ( "{0} {1} -> {2:0.00}" , Ogrenci . Adi , Ogrenci . Soyadi , Ogrenci . Ortalama ); } } Console.ReadLine(); Yuvalanmış (Nested) GroupBy Örneği Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları sınıflarına göre gruplandırır. Oluşturduğu sınıf gruplarının anahtarları (sınıf bilgisi) ve sınıf grubu içinde ikinci bir gruplandırma ile öğrencileri cinsiyetine göre ayırdığı bir alt gruplandırma ile oluşturduğu isimsiz tipleri seçer. Oluşan grup listesindeki grupları ve gruplardaki öğrencilerin numara ad ve soyadlarını iç içe foreach döngüleri kullanarak çıktıya yazar. var Ogrenciler = OgrencileriGetir (); var CinsiyeteGoreSinifListeleri = from Ogrenci in Ogrenciler orderby Ogrenci . No group Ogrenci by Ogrenci . Sinif into SinifGrubu select new { SinifNo = SinifGrubu . Key , SinifOgrencileri = from BuSiniftakiOgrenci in SinifGrubu orderby BuSiniftakiOgrenci . Cinsiyet group BuSiniftakiOgrenci by BuSiniftakiOgrenci . Cinsiyet into SinifCinsiyetGrubu select SinifCinsiyetGrubu }; Console . WriteLine ( "Cinsiyete Göre Gruplanmış Sınıf Öğrenci Listeleri..." ); foreach ( var Sinif in CinsiyeteGoreSinifListeleri ) { Console . WriteLine ( "\n{0}. sınıf öğrencileri :" , Sinif . SinifNo ); foreach ( var OgrenciGrubu in Sinif . SinifOgrencileri ) { Console . WriteLine ( "{0} öğrenciler:" , OgrenciGrubu . Key ); foreach ( var Ogrenci in OgrenciGrubu ) { Console . WriteLine ( "{0} - {1} {2}" , Ogrenci . No , Ogrenci . Adi , Ogrenci . Soyadi ); } } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Cinsiyete Göre Gruplanmış Sınıf Öğrenci Listeleri... 2. sınıf öğrencileri : Bayan öğrenciler: 3 - Hale Birinci 13 - Ayşe Hanım Erkek öğrenciler: 1 - Nuri Babayiğit 6 - Ahmet Geçe 16 - Erhan Fidan 4. sınıf öğrencileri : Erkek öğrenciler: 2 - Tuncay Çağrı 8 - Mesut Bahtiyar 12 - Veli Canlı 14 - Mehmet Emre 3. sınıf öğrencileri : Bayan öğrenciler: 4 - Jale İkinci 9 - Lale Üçüncü 15 - Fatma Teyze Erkek öğrenciler: 11 - Cevdet Döğer 17 - Erhan Çelik 1. sınıf öğrencileri : Erkek öğrenciler: 5 - Kenan Oran 7 - Tekin Uğurlu 10 - Erhan Erkanlı Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir: var Ogrenciler = OgrencileriGetir (); var CinsiyeteGoreSinifListeleri = Ogrenciler . OrderBy ( Ogrenci => Ogrenci . No ) . GroupBy ( Ogrenci => Ogrenci . Sinif ) . Select ( SinifGrubu => new { SinifNo = SinifGrubu . Key , SinifOgrencileri = SinifGrubu . OrderBy ( BuSiniftakiOgrenci => BuSiniftakiOgrenci . Cinsiyet ) . GroupBy ( BuSiniftakiOgrenci => BuSiniftakiOgrenci . Cinsiyet ) }); Console . WriteLine ( "Cinsiyete Göre Gruplanmış Sınıf Öğrenci Listeleri..." ); foreach ( var Sinif in CinsiyeteGoreSinifListeleri ) { Console . WriteLine ( "\n{0}. sınıf öğrencileri :" , Sinif . SinifNo ); foreach ( var OgrenciGrubu in Sinif . SinifOgrencileri ) { Console . WriteLine ( "{0} öğrenciler:" , OgrenciGrubu . Key ); foreach ( var Ogrenci in OgrenciGrubu ) { Console . WriteLine ( "{0} - {1} {2}" , Ogrenci . No , Ogrenci . Adi , Ogrenci . Soyadi ); } } } Console.ReadLine(); Karşılaştırıcı Kullanan GroupBy Örnekleri : GroupBy , bir karşılaştırıcı ile kullanılabilir. Karşılaştırıcı, IEqualityComparer arayüzünü uygulayan, Equals ve GetHashCode isimli iki metoda sahip bir sınıftır. IEqualityComparer 'in Equals yöntemi, grupları birbirinden ayıracak, gelen iki parametrenin eşit olup olmadığını döndüren bir yöntemdir. Biz örneğimizde hem cinsiyeti, hem de başarı durumu farklı olanların farklı gruplar olduğunu bildiren bir kod yazdık. IEqualityComparer 'in GetHashCode   yöntemi ise, verileri birbirinden ayırmak için kullanılacak HashCode adı verilen bir kod üretir. Bu kodun hangi verilerden üretileceğini bu yöntem içinde biz belirtiriz. GroupBy da kayıtları birbirinden ayırmak için bu yöntemi çağırır. HashCode , sınıfların birbirinden ayıracak özel bir sayıdır (32 bit bir tamsayıdır). Sınıfların GetHashCode yöntemi ile elde edilebilir. Bu kod özel bir algoritma ile üretilir ve verileri karşılaştırmada kullanılır ancak her sınıfın HasCode değerinin farklı olacağının bir garantisi yoktur. Karşılaştırıcı Kullanarak GroupBy Örneği Bu örnek öğrenci bilgilerinden oluşan bir veri kaynağındaki kayıtları karşılaştırıcı sınıfı kullanarak başarı durumları ve cinsiyetlerine göre gruplandırır (Başarılı erkekler, başarısız erkekler, başarılı bayanlar ve başarısız bayanlar). İç içe 2 döngü kullanarak grupların bilgilerini ve gruplardaki öğrencilerin ad, soyad ve ortalama bilgilerini çıktıya yazar. var Ogrenciler = OgrencileriGetir (); var CinsiyeteGoreBasariListesi = Ogrenciler . GroupBy ( Ogrenci => Ogrenci , new CinsiyeteGoreBasariKarsilastirici ()); Console . WriteLine ( "Cinsiyete göre başarı durumları listesi..." ); foreach ( var OgrenciGrubu in CinsiyeteGoreBasariListesi ) { Console . WriteLine ( "\n{0} {1} :" , OgrenciGrubu . Key . Basarili ? "Başarılı" : "Başarısız" , OgrenciGrubu . Key . Cinsiyet == "Erkek" ? "erkekler" : "bayanlar" ); foreach ( var Ogrenci in OgrenciGrubu ) { Console . WriteLine ( "{0} {1}. Ortalaması {2:0.00}" , Ogrenci . Adi , Ogrenci . Soyadi , Ogrenci . Ortalama ); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Cinsiyete göre başarı durumları listesi... Başarılı erkekler : Tuncay Çağrı. Ortalaması 73,33 Ahmet Geçe. Ortalaması 76,67 Mehmet Emre. Ortalaması 66,33 Nuri Babayiğit. Ortalaması 65,00 Kenan Oran. Ortalaması 66,67 Erhan Erkanlı. Ortalaması 90,00 Erhan Fidan. Ortalaması 86,25 Erhan Çelik. Ortalaması 78,33 Başarılı bayanlar : Jale İkinci. Ortalaması 97,00 Fatma Teyze. Ortalaması 89,25 Ayşe Hanım. Ortalaması 80,00 Başarısız erkekler : Tekin Uğurlu. Ortalaması 30,00 Mesut Bahtiyar. Ortalaması 36,67 Veli Canlı. Ortalaması 43,33 Cevdet Döğer. Ortalaması 16,25 Başarısız bayanlar : Hale Birinci. Ortalaması 25,00 Lale Üçüncü. Ortalaması 16,67 Örnekte kullanılan karşılaştırıcı sınıf şöyledir : public class CinsiyeteGoreBasariKarsilastirici : IEqualityComparer { public bool Equals ( Kayit x , Kayit y ) { if ( x . Cinsiyet != y . Cinsiyet && x . Basarili != y . Basarili ) return false ; return true ; } public int GetHashCode ( Kayit Ogrenci ) { return Ogrenci . Basarili . GetHashCode () + Ogrenci . Cinsiyet . GetHashCode (); } } Karşılaştırıcı Kullanarak Haritalanmış (Mapped) GroupBy Örneği Örneğimiz, bir dizideki anagramları (aynı harflerle yazılan kelimeler) bulmaktadır. Karşılaştırıcı sınıfta kelimelerin anagram olup olmadıklarını belirleyen " SiraliKarakterleriVer " isimli özel bir yöntem kullanıldı. Bu yöntem parametre olarak verilen kelimedeki harfleri alfabetik sıraya sokmaktadır. Anagram kelimelerin harflerinin alfabetik sırası aynı olacağından bu yöntem sayesinde anagram kelimeler karşılaştırılabilmektedir. Bu örnek dizideki anagramları bulur ve gruplandırır. Daha sonra bu anagram gruplarını çıktıya yazar. string [] Anagramlar = { "şart" , "yumak" , "antik" , "traş" , "yamuk" , "nakit" }; var AnagramGruplari = Anagramlar . GroupBy ( Kelime => Kelime , new AnagramEsitlikKarsilastirici ()); Console . WriteLine ( "Dizideki anagramlar :" ); foreach ( var Grup in AnagramGruplari ) { Console . WriteLine ( "---" ); foreach ( var Kelime in Grup ) { Console . WriteLine ( Kelime ); } } Console.ReadLine(); Örneğin çıktısı şöyle olacaktır : Dizideki anagramlar : --- şart traş --- yumak yamuk --- antik nakit Dizide kullanılan karşılaştırıcı sınıf şöyledir: public class AnagramEsitlikKarsilastirici : IEqualityComparer { public bool Equals ( string x , string y ) { return SiraliKarakterleriVer ( x ) == SiraliKarakterleriVer ( y ); } public int GetHashCode ( string obj ) { return SiraliKarakterleriVer ( obj ). GetHashCode (); } private string SiraliKarakterleriVer ( string Kelime ) { char [] KelimeninKarakterleri = Kelime . ToCharArray (); Array . Sort ( KelimeninKarakterleri ); return new string ( KelimeninKarakterleri ); } }
Ekleyen: canora

En fazla 3 eski durum gösterilir.