17 Aralık 2017 Pazar

Linq Aggregation Metodları

Not : Ana Linq yazısına burada. Metodları işlevlerine göre gruplandırdığım için bu yeni yazıya gerek duydum.

Giriş
Aggregation metodları Enumerable listesini dolaşarak tek bir sonuç döndürürler.

Aggregate metodu
Tüm elemanlara bir işlem uygulayarak birleştirmek için kullanılır. Aggregate metodu şöyle çalışır. ilk eleman için bir sonuç üretilir. Aynı sonuç ikinci elemanı çağırırken a parametresi olarak geçilir. Böylece birleştirme işlemi yerine getirilir.

Seed Olmadan Kullanımı
En çok verilen örnek dizinin toplamını bulmak şeklinde ancak aşağıdaki csv satırını oluşturma örneği daha güzel.
var chars = new []{"a","b","c", "d"};
var csv = chars.Aggregate( (a,b) => a + ',' + b);
Console.WriteLine(csv); // Output a,b,c,d
Seed İle Kullanımı
Bir başka örnekte bir çok listenin kesişimi bulunuyor. Yukarıda anlatıldığı gibi h HashSet'i ilk Aggregate çağrısından sonra her Aggregate çağrısına h parametresi olarak geçildiği için kesişim bulunabiliyor.
var intersection = listOfLists
    .Skip(1)
    .Aggregate(
        new HashSet<T>(listOfLists.First()),
        (h, e) => { h.IntersectWith(e); return h; }
    );
Bir başka örnekte stringler birleştiriliyor.
public static string FizzBuzz(int start, int end)
{
        return Enumerable.Range(start, (end - start) + 1)
            .Select(FizzOrBuzz)
            .Aggregate(String.Empty, (y, x) => String.Format("{0} {1}", y, x))
            .Trim();
}

Average metodu
Average Min ve Max gibi istatistiki metodlar kullanılabiliyor. C++ dilinde bu tür metodlar matematiksel veya istatistiki algoritmalar grubuna dahil edilirken, C#'ta aggregation grubuna dagil edilmişler. Örnek:
var startIndex = 10; // zero-based, say
var max = temp.Skip(startIndex).Max();
var min = temp.Skip(startIndex).Min();
var avg = temp.Skip(startIndex).Average();
Bu metod haliyle double bir sonuç döner.
List<int> numbers = new List<int>{ 10, 20, 30, 40, 50 };
double average = numbers.Average();  // 30.0
Count metodu
List sınıfında Count property'si de var, ancak Linq ile gelen Count() bir metod! Linq Count() metodu tüm veri yapısını dolaşacağı için uzun yapılarda dikkatli kullanılmalı.

Max Metodu
Örnek ver

Min metodu
Örnek ver

Sum metodu
GroupBy ve Sum beraber kullanılabiliyor. Örnek:
var results =
    owlList.SelectMany(owl => owl.BandIdentifier.Split('_'), 
                       (owl, band) => new { owl, band })
           .GroupBy(x => x.band)
           .Select(group => new Owl 
                   {
                       BandIdentifier = group.Key
                       SpeciesCount = group.Sum(g => g.SpeciesCount)
                   });

Hiç yorum yok:

Yorum Gönder