Distinct i Linq İçerisinde Kullanmak

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,730
Aslında tek sütun adı döndüren Linq sorgulamalarında Distinct kullanımı gayet basittir. MSDN in bu konuda verdiği örneğe bakalım.

Kod:
public void Linq46()
{
    int[] factorsOf300 = { 2, 2, 3, 5, 5 };
 
    var uniqueFactors = factorsOf300.Distinct();
 
    Console.WriteLine("Prime factors of 300:");
    foreach (var f in uniqueFactors)
    {
        Console.WriteLine(f);
    }
}

Kod:
public void Linq47()
{
    List<Product> products = GetProductList();
 
    var categoryNames = (
        from p in products
        select p.Category)
        .Distinct();
 
    Console.WriteLine("Category names:");
    foreach (var n in categoryNames)
    {
        Console.WriteLine(n);
    }
}

.Distinct() işimizi görüyor. Ancak çok sutünlu sorgulamalarda Geriye List<TObject> biçiminde değer döndüreceksek kendi klasımızı kendimiz yazmalıyız. IEqualityComparer<TObject> türünüde miras alması gerekmetedir.

Kod:
//ListSınıfı için Distinct
    public class DistinctBasvurular : IEqualityComparer<UcretliBasvurulari>
    {
        public bool Equals(UcretliBasvurulari x, UcretliBasvurulari y)
        {

            if (x == null || y == null)    //optional
                return false;

            else
                return x.Bolum == y.Bolum;

        }
        public int GetHashCode(UcretliBasvurulari basvuru)
        {
            return basvuru.Bolum.GetHashCode();
        }

    }

Bunu kullandığımız fonksiyonumuz aşağıdaki gibi olacaktır. UcretliBasvurulari benim daha önceden tanımladığım bir tür.

Kod:
private List<UcretliBasvurulari> BolumBagla()
    {
        IEnumerable ie = ObjectDataSource1.Select();
        var sonuc = (from s in ie.Cast<UcretliBasvurulari>()
                     orderby s.Bolum descending
                     select s).Distinct(new DistinctBasvurular());
        return sonuc.ToList<UcretliBasvurulari>();
    }
 
Geri
Üst