30 Ağustos 2016 Salı

Linq Projection Metodları

Giriş
Projection metodları bir nesneyi başka bir nesneye döndürürler.

Select Metodu
Select Metodu yazısına taşıdım.

SelectMany
SelectMany iki farklı işi görür.

1. Düzleştirme İşlemi
İlki IEnumerable of IEnumerable şeklindeki veri yapısını (array of array, List of List vs) düzleştirerek, IEnumerable haline getirir.

Elimizde şöyle bir veri yapısı olsun.
IEnumerable<IEnumerable<TempTotals>> yourCollection;
Şöyle yaparız.
Dictionary<string, decimal?> test =
    yourCollection
        .SelectMany(rd => rd.TempTotals)
        .GroupBy(tt => tt.ClaimType, tt => tt.Amount)
        .ToDictionary(g => g.Key, g => g.Sum());
Çıktı olarak şuna benzer bir şey alırız.
Dictionary<string, decimal> test = new Dictionary<string, decimal>() {
  {"Claim",2 },
  {"Query", 500 },
  {"Normal", 700 }
};
Girdiyi satırlara ayırıp daha sonra da virgülden itibaren ayırmak için şöyle yaparız.
string numbers = "1,2,3\n4,5,6\n7,8,9";
IEnumerable<int> parsedNumbers =
numbers.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
.SelectMany(r => r.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries))
.Select(int.Parse);
Düzleştirme (flatten) işlemini görselleştiren bir şekil burada.

2. Cartesian Product
İkincisi ise bir veritabanında olduğu gibi cartesian product yapmasıdır. Örnek:
List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };

var mix=number.SelectMany(num => animals, (n, a) => new { n, a });
Bu kodun sonucu aşağıdaki gibidir
{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}
Aynı sonucu Join ile de elde edebilirdik ama SelectMany daha okunaklı.
var result = number.Join(animals, x => true, y => true, (m, n) => new { m, n });







Hiç yorum yok:

Yorum Gönder