C# Linq İfadelerinin TypeScript Karşılıkları

Bu yazımda C# dilindeki Linq fonksiyonlarının TypeScript deki karşılıklarını göstermeye çalışacağım.
Aşağıda belirtmiş olduğum fonksiyonların içinde bazılarında açıklama olacak şekilde, ilk C# için bir örnek hemen ardından TyprScript için örnek olmak üzere karşılıklarını yazmaya çalıştım.

 

  • Aggregate
  • Aggregate bir koleksiyonda bulunan sayısal değerleri belirlenen işleme göre hesaplamayı sağlar.

    C#

    var numbers = new int[] { 1, 2, 3, 4 };
    var result = numbers.Aggregate((a, b) => a * b);
    // result = 24
    

    TypeScript

    var total = [0, 1, 2, 3]
    var result = total.reduce((a, b) => { return a + b; });

     

  • All
  • All, bir listedeki elemanların tümünün verilen şarta uyup uymadığını boolean olarak döndürür.

    C#

    int[] array = { 10, 20, 30 };
    bool result = array.All(x => x >= 10);
    // result = true
    

    TypeScript

    function ispositive(element, index, array) {
        return element > 0;
    }
    var arr = [10, 88, 22, 6, 97];
    var value = arr.every(ispositive);

     

  • Any
  • Any bir listede belirtilen koşula uygun kayıt olup olmadığını kontrol eder ve sonucu boolean olarak döndürür.

    C#

    int[] array = { 1, 2, 3 };
    bool result = array.Any(item => item % 2 == 0);
    // result = true
    

    TypeScript

    function ispositive(element, index, array) {
        return element > 0;
    }
    var arr = [12, 90, 24, 8, 99];
    var value = arr.some(ispositive);

     

  • Append
  • C#

    var numbers = new [] { "one", "two", "three" };
    numbers = numbers.Append("four").ToArray();
    Console.WriteLine(string.Join(", ", numbers));
    // one, two, three, four
    

    TypeScript

    const numbers = ["one", "two", "three"];
    const result = [...numbers, "four"];

     

  • Average
  • Bir dizi içerisindeki elemanların ortalamasını alıp size sonucu verir.

    C#

    int[] array = { 10, 20, 30 };
    var avg = array.Average();
    // avg = 20
    

    TypeScript

    var arr = [10, 20, 30];
    const avgAge = arr.reduce((a, u) => a + u, 0) / arr.length;

     

  • Cast
  • C#

    var people = users.Cast<Person>();

    TypeScript

    const people = users as Person[];

     

  • Concat
  • Concat işlemi iki string ifadeyi veya iki diziyi birleştirmeye yarar.

    C#

    string x = "C#";
    string y = "TypeScript";
    string.Concat(x, y);
    
    int[] cift = { 0, 2, 4, 6, 8 };
    int[] tek = { 1, 3, 5, 7, 9 };
    var rakamlar = cift.Concat(tek).ToList();
    // rakamlar = 0, 2, 4, 6, 8, 1, 3, 5, 7, 9
    

    TypeScript

    var cift = [0, 2, 4, 6, 8];
    var tek = [1, 3, 5, 7, 9];
    const rakamlar = [...cift, ...tek];

     

  • Contains
  • Aranılan değeri kontrol eder sonuca göre boolean değer döndürür.

    C#

    int[] array = { 10, 20, 30 };
    var result = array.Contains(20);
    // result = true
    

    TypeScript

    const array = [10, 20, 30];
    const result = array.includes(20);

     

  • Count
  • C#

    int[] arr = { 10, 20, 30 };
    var result = arr.Count();
    // result = 3
    

    TypeScript

    const arr = [10, 20, 30];
    var result = arr.length;

     

  • DefaultIfEmpty
  • Eğer istediğimiz koşulu sağlamıyorsa atanan değeri döndürür.

    C#

    int[] list = { };
    var result = list.DefaultIfEmpty(0);
    // result = 0
    

    TypeScript

    const list = [];
    const listResult = list.length ? list : [0];

     

  • Distinct
  • Distinct tekrarlayan kayıtları bir kere almak istediğimiz zamanlarda kullanılır.

    C#

    int[] arr = { 1, 2, 3, 2, 3, 2, 4, 1, 4 };
    var distinctList = arr.Distinct();
    // distinctList = 1, 2, 3, 4
    

    TypeScript

    const arr = [1, 2, 3, 2, 3, 2, 4, 1, 4];
    var distinctList = arr.filter(function (item, pos) {
        return arr.indexOf(item) == pos;
    });

     

  • ElementAt
  • ElementAt listedeki verilen index numarasına göre elemanı seçer.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.ElementAt(2);
    // result = 3
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[2];

     

  • ElementAtOrDefault
  • ElementAtOrDefault listedeki verilen index numarasına göre elemanı seçer, ancak verilen index değeri dizi aralığı dışında ise varsayılan değeri döner.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.ElementAtOrDefault(5);
    // result = 3
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[5];

     

  • Empty
  • Empty hiçbir öğe içermeyen bir koleksiyon oluşturur. Dizide herhangi bir öğe gönderilmesi istenmediği durumda kullanılır.

    C#

    var emptyExample = Enumerable.Empty<string>();

    TypeScript

    const emptyExample: string[] = [];
    const emptyExample = [] as string[];

     

  • Except
  • Farklı 2 dizi içerisinde, ilk dizide bulunan ama ikinci dizide bulunmayan kayıtları listelemek için kullanılır.

    C#

    int[] arr1 = { 0, 2, 4, 5, 6, 8, 9 };
    int[] arr2 = { 1, 3, 5, 7, 8 };
    var result = arr1.Except(arr2);
    // result = 0, 2, 4, 6, 9
    

    TypeScript

    const arr1 = [0, 2, 4, 5, 6, 8, 9 ];
    const arr2 = [1, 3, 5, 7, 8];
    const result = arr1.filter(u =>
        !arr2.includes(u)
    );

     

  • First
  • First ifadesinde bulunan ilk veri geriye döner.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.First();
    // result = 1
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[0];

     

  • FirstOrDefault
  • Bulduğu ilk elemanı alır eğer sonuç yok ise, default olarak varsayılan değerini döndürür.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.FirstOrDefault();
    // result = 1
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[0];

     

  • List.ForEach
  • C#

    int[] numbers = { 12, 24, 36 };
    // List<int> numbers = new List<int> { 12, 24, 36 };
    numbers.ToList().ForEach(x =>
        Console.WriteLine(x * 2)
    );
    // 24, 48, 72
    

    TypeScript

    const numbers = [12, 24, 36];
    const result = [];
    numbers.forEach(function (item) {
        result.push(item * 2);
    });

     

  • GroupBy
  • Verilerin gruplanması için kullanılır.

    C#

    int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    var result = arr.GroupBy(x => x % 2);
    // [0] = 1, 3, 5, 7, 9
    // [1] = 2, 4, 6, 8, 10
    

    TypeScript

    const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    const result = arr.reduce((ubc, u) => ({
        ...ubc,
        [u % 2]: [...(ubc[u % 2] || []), u],
    }), {});

     

  • Intersect
  • Farklı iki dizide bulunan tekrarlayan kayıtları listelemek için kullanılır.

    C#

    int[] arr1 = { 10, 20, 30 };
    int[] arr2 = { 30, 40, 50 };
    var result = arr1.Intersect(arr2);
    // result = 30
    

    TypeScript

    const arr1 = [10, 20, 30];
    const arr2 = [30, 40, 50];
    const result = arr1.filter(u =>
        arr2.includes(u)
    );

     

  • Last
  • Dizi içerisinde bulunan son elemanı alır.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.Last();
    // result = 4
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[arr.length - 1];

     

  • LastOrDefault
  • Dizi içerisinde bulunan son elemanı alır, eğer sonuç yok ise default olarak varsayılan değerini döndürür.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.LastOrDefault();
    // result = 4
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[arr.length - 1];

     

  • Max
  • Dizi içerisindeki sayısal değerlerden en büyük olanı getirir.

    C#

    public class Personel
    {
        public int Yasi { get; set; }
    }
    
    List<Personel> liste = new List<Personel>()
    {
        new Personel() { Yasi = 24 },
        new Personel() { Yasi = 32 },
        new Personel() { Yasi = 28 },
        new Personel() { Yasi = 41 }
    };
    var result = liste.Max(x => x.Yasi);
    // result = 41
    

    TypeScript

    const liste = [
        { yas: 24 },
        { yas: 32 },
        { yas: 28 },
        { yas: 41 }
    ];
    const result = liste.reduce((x, u) => Math.max(x, u.yas), 0);
    
    //farklı bir yöntem
    const result = liste.reduce((max, val) => max > val ? max : val, liste[0]);
    
    //farklı bir yöntem
    function maxValue(liste) {
        let max = liste[0];
        for (let val of liste) {
            if (val > max) {
                max = val;
            }
        }
        return max;
    }
    

     

  • Min
  • Dizi içerisindeki sayısal değerlerden en küçük olanı getirir.

    C#

    List<Personel> liste = new List<Personel>()
    {
        new Personel() { Yasi = 24 },
        new Personel() { Yasi = 32 },
        new Personel() { Yasi = 28 },
        new Personel() { Yasi = 41 }
    };
    var result = liste.Min(x => x.Yasi);
    // result = 24
    

    TypeScript

    const liste = [
        { yas: 24 },
        { yas: 32 },
        { yas: 28 },
        { yas: 41 }
    ];
    const result = liste.reduce((x, u) => Math.min(x, u.yas), Number.MAX_VALUE);

     

  • OfType
  • Koleksiyon içerisinde farklı tipteki verilerin belirtilen tiptekilerinin listelenmesi için kullanılır.

    C#

    object[] values = { "Ad", "Soyad", 10, 80, "Meslek", 9.5 };
    var result = values.OfType<int>();
    // result = 10, 80
    

    TypeScript

    // Eşdeğeri yok

     

  • OrderBy / OrderByDescending
  • Koleksiyondaki öğeleri, artan veya azalan sıraya göre sıralar. Varsayılan değeri Ascending’dir. (Artan sıraya göre).
    Azalan olması için, OrderByDescending değeri kullanılır.

    C#

    int[] numbers = { 2, 6, 3, 10, 13, 7, 8 };
    var result1 = numbers.OrderBy(x => x);
    var result2 = numbers.OrderByDescending(x => x);
    // result1 = 2, 3, 6, 7, 8, 10, 13
    // result2 = 13, 10, 8, 7, 6, 3, 2
    

    TypeScript

    const arr1 = [2, 6, 3, 10, 13, 7, 8];
    const arr2 = [2, 6, 3, 10, 13, 7, 8];
    const ascending = arr1.sort((a, b) => (a > b ? 1 : -1));
    const descending = arr2.sort((a, b) => (a > b ? -1 : 1));

     

  • ThenBy / ThenByDescending
  • Koleksiyon içerisinde çoklu sıralama yapılması için kullanılır. Önce koleksiyon içerisinde OrderBy veya OrderByDescending ile sıralama yapılıp, daha sonrasında ThenBy(Artan) veya ThenByDescending(Azalan) ile tekrar sıralama yapılarak istenilen hali elde edilir.

    C#
    Burada ilk önce orderBy ile listedeki şehirleri kendi içinde uzunluğuna göre sıraladık, daha sonra sıralanan bu uzunluklara göre ThenBy ve ThenByDescending kullanılarak artan ve azalan olarak tekrar sıralama yapıldı.

    string[] citys = { "İstanbul", "Ankara", "İzmir", "Eskişehir", "Muğla", "Çanakkale", "Edirne" };
    var result1 = citys.OrderBy(x => x.Length).ThenBy(x => x);
    var result2 = citys.OrderBy(x => x.Length).ThenByDescending(x => x);
    // result1 = İzmir, Muğla, Ankara, Edirne, İstanbul, Çanakkale, Eskişehir
    // result2 = Muğla, İzmir, Edirne, Ankara, İstanbul, Eskişehir, Çanakkale
    

    TypeScript

    const citys1 = ["İstanbul", "Ankara", "İzmir", "Eskişehir", "Muğla", "Çanakkale", "Edirne"];
    const citys2 = ["İstanbul", "Ankara", "İzmir", "Eskişehir", "Muğla", "Çanakkale", "Edirne"];
    const ascending = citys1.sort((a, b) => {
        const lengthDiff = a.length - b.length;
        if (lengthDiff) return lengthDiff;
        return a.localeCompare(b);
    });
    const descending = citys2.sort((a, b) => {
        const lengthDiff = a.length - b.length;
        if (lengthDiff) return lengthDiff;
        return b.localeCompare(a);
    });

     

  • Reverse
  • Koleksiyondaki verilerin tersine sıralanması için kullanılır.

    C#

    int[] numbers = { 2, 6, 3, 10, 13, 7, 8 };
    var result = numbers.Reverse();
    // result = 8, 7, 13, 10, 3, 6, 2
    

    TypeScript

    const numbers = [2, 6, 3, 10, 13, 7, 8];
    const result = numbers.reverse();

     

  • Select
  • Listede bulunan değerin seçilebilmesi veya seçilen değer üzerinde işlem yapılabilmesini sağlar.

    C#

    int[] arr = { 1, 2, 3, 4, 5 };
    var result = arr.Select(x => x * 4);
    // result = 4, 8, 12, 16, 20
    

    TypeScript

    const arr = [1, 2, 3, 4, 5];
    const result = arr.map(x => x * 4);

     

  • SelectMany
  • Farklı 2 veri kaynağından seçilen kayıtları ortak bir alanda birleştirip tek bir kayıt elde edilmesini sağlar.

    C#

    string[] harf = { "a", "b", "c", "d" };
    int[] rakam = { 1, 2, 3, 4 };
    //var result = harf.SelectMany(x => rakam, (x, y) => new
    //{
    //    harfler = x,
    //    rakamlar = y
    //});
    var result = harf.SelectMany(x => rakam, (x, y) => (x + " - " + y));
    // result = "a - 1", "a - 2", "a - 3", "a - 4", "b - 1", "b - 2", "b - 3", "b - 4", "c - 1", "c - 2", "c - 3", "c - 4", "d - 1", "d - 2", "d - 3", "d - 4"
    

    TypeScript

    const harf = ["a", "b", "c", "d"];
    const rakam = [1, 2, 3, 4];
    const result = harf.reduce<string[]>((x, y) => [...x, ...rakam.map((n) => `${y} - ${n}`)], []);

     

  • Single
  • Dizi içerisinde bulunan belirttiğiniz bir öğeyi getirir.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.Single(x => x == 3);
    // result = 3
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[2];

     

  • SingleOrDefault
  • Dizi içerisinde bulunan elemanlardan tek bir değer döndürür. Sonuç yok ise varsayılan değer döner.

    C#

    int[] arr = { 1, 2, 3, 4 };
    var result = arr.SingleOrDefault(x => x == 5);
    // result = 0
    

    TypeScript

    const arr = [1, 2, 3, 4];
    const result = arr[4];

     

  • Skip
  • Dizi içerisinde bulunan verilerin başlangıç index’ini belirleyip o index numarasından sonraki verileri getirir.

    C#

    int[] numbers = { 1, 2, 3, 4, 5, 6, 7 };
    var result = numbers.Skip(3);
    // result = 4, 5, 6, 7
    

    TypeScript

    const numbers = [1, 2, 3, 4, 5, 6, 7];
    const result = numbers.filter((u, i) => i >= 3);

     

  • SkipWhile
  • Dizi içerisinde bulunan verilerin belirtilen koşula göre başlangıç index’ini belirleyip o index numarasından sonraki verilerin getirilmesini sağlar.

    C#
    Burada 3 den küçük olan sayıları kontrol eder ve bunları almaz, ne zaman ki koşul sağlanmadı, ordan itibaren ki sayıları alır. Yani 3,4,5,6,7 yi alacaktır.

    int[] numbers = { 1, 2, 3, 4, 5, 6, 7 };
    var result = numbers.SkipWhile(x => x < 3);
    // result = 3, 4, 5, 6, 7
    

    TypeScript

    const numbers = [1, 2, 3, 4, 5, 6, 7];
    let i = 0;
    while (i < numbers.length && 3 > (numbers[i++]));
    const result = numbers.slice(i - 1);

     

  • Sum
  • Dizi içerisinde bulunan sayısal değerleri toplamayı sağlar.

    C#

    int[] numbers = { 9, 20, 29, 44, 49, 86 };
    var result = numbers.Sum();
    // result = 237
    

    TypeScript

    const numbers = [9, 20, 29, 44, 49, 86];
    const result = numbers.reduce((x, y) => x + y, 0);

     

  • Take
  • Dizide listelenecek olan veri adedini belirtir, Sql’de Top() ile aynı anlama gelir.

    C#

    var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
    var result = numbers.Take(3);
    // result = 1, 2, 3
    

    TypeScript

    const numbers = [1, 2, 3, 4, 5, 6, 7];
    const result = numbers.filter((u, i) => i < 3);

     

  • TakeWhile
  • Dizide de bulunan verilerin, belirlenen koşula göre başlangıç index’inden itibaren belirtilen adet kadarının listelenmesini sağlar.

    C#
    Not: Burada TakeWhile’ın Where den farkı, TakeWhile koşul sağlanmadığında dururken, Where devam eder ve koşulu sağlayan tüm elemanları getirir.

    int[] numbers = { 1, 2, 3, 4, 5, 6, 7 };
    var result = numbers.TakeWhile(x => x <= 3);
    // result = 1, 2, 3
    

    TypeScript

    const numbers = [1, 2, 3, 4, 5, 6, 7];
    let i = 0;
    while (i < numbers.length && 3 >= (numbers[i++]));
    const result = numbers.slice(0, i - 1);

     

  • Union
  • Koleksiyonda bulunan verilerin tekrarları olmadan, değerleri geri döner.

    C#

    IList<string> list1 = new List<string>() { "Zero", "One", "two", "Three" };
    IList<string> list2 = new List<string>() { "One", "TWO", "Three", "Four" };
    var result = list1.Union(list2);
    // result = "Zero, One, two, Three, TWO, Four"
    

    TypeScript

    const list1 = ["Zero", "One", "two", "Three"];
    const list2 = ["One", "TWO", "Three", "Four"];
    const result = list1.reduce((x, y) =>
        x.includes(y) ? x : [...x, y], list2);

     

  • Where
  • Sorgularda filtreleme için kullanılır.

    C#

    List<Personel> liste = new List<Personel>()
    {
        new Personel() { Yasi = 24 },
        new Personel() { Yasi = 32 },
        new Personel() { Yasi = 28 },
        new Personel() { Yasi = 41 }
    };
    var result = liste.Where(u => u.Yasi >= 30);
    // [0] = 32
    // [1] = 41
    

    TypeScript

    const liste = [
        { yas: 24 },
        { yas: 32 },
        { yas: 28 },
        { yas: 41 }
    ];
    const result = liste.filter(u => u.yas >= 30);

     

  • Zip
  • Farklı iki koleksiyonun index sıralamalarına göre birleştirilmesi için kullanılır.

    C#

    string[] list1 = { "Bir", "İki", "Üç" };
    int[] list2 = { 1, 2, 3 };
    var result = list1.Zip(list2, (p, d) => p + " : " + d);
    // result = "Bir : 1", "İki : 2", "Üç : 3"
    

    TypeScript

    const list1 = ["Bir", "İki", "Üç"];
    const list2 = [1, 2, 3];
    const matches = [];
    for (let i = 0; i < list1.length && i < list2.length; i++) {
        matches.push({
            Text: list1[i],
            Number: list2[i],
        });
    }

    C# daki Linq fonksiyonlarının TypeScript karşılıklarını birer örnekle gösterip açıklamaya çalıştım, umarım faydalı bir yazı olmuştur.
    Soru veya görüşlerinizi lütfen yorum olarak belirtin.

    Faydalandığım kaynakları aşağıda belirttim:
    https://decembersoft.com/posts/typescript-vs-csharp-linq/
    https://www.tutorialsteacher.com/linq/linq-standard-query-operators
    https://csharp-tutorials.com/tr-TR/linq

     

    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir