10 Nisan 2017 Pazartesi

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

Hiç yorum yok: