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

