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 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, 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 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);
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"];
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;
C#
var people = users.Cast<Person>();
TypeScript
const people = users as Person[];
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];
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);
C#
int[] arr = { 10, 20, 30 }; var result = arr.Count(); // result = 3
TypeScript
const arr = [10, 20, 30]; var result = arr.length;
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 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 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 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 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[];
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 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];
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];
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); });
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], }), {});
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) );
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];
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];
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; }
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);
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
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));
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); });
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();
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);
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}`)], []);
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];
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];
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);
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);
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);
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);
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);
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);
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);
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