C# LINQ Nedir? Gelin birlikte LINQ Sorguları Yazalım.

xavier eckert

Basın&Medya Ekibi Kıdemli
16 Tem 2016
1,636
288
LINQ Nedir?
Açılımı Language-Integrated Query olan LINQ, veri kaynaklarına erişim ve filtreleme gibi işleri yapabildiğimiz bir sorgu dilidir.
LINQ Objeler, SQL, XML için kullanabiliriz. Aslında IEnumerable arayüzünü implemente eden, IEnumerable nesneler koleksiyonu için LINQ sorgularını kullanabiliriz. Bu tanımlar kafanızı karıştırabilir ama örneklerle kafanızdaki soruları gidermeye çalışacağım.

20-11.jpg
Öncelikle LINQ sorgularını kullanabilmek için
C#:
using System.Linq;
projenizin en üstüne yazarak LINQ kullanmaya başlayabilirsiniz.

En başta iki şekilde LINQ sorgularını kullanabiliriz. Öncelikle bir veri kümesi oluşturalım .
Tabi önce liste oluşturmadan Uye adında bir sınıf oluşturuyorum.


C#:
record Uye // Class'tan farklı olarak sabit bir yapı olarak atadım. Bilginiz yok ise Class'tan farkı yok diyebiliriz.
{
    public int id{ get; init; }
    public string isim { get; init; }
    public string nick { get; init; }
    public override string ToString() // ToString() metodunu burada üzerine yazıyoruz. Yani string veri tipine dönüşüm yapılırsa aşağıda belirtilen şekilde yazı dönüşecek.
    {
        return $"id: {id}, isim: {isim}, nick: {nick}";
    }
}
Şimdi bu üyeleri interface içerisinde oluşturup veri kümemi oluşturuyorum.
C#:
IList<Uye> uyeler = new List<Uye>() {
    new Uye(){ id = 1, isim = "mert", nick = "xaviereckert" },
    new Uye(){ id = 2, isim = "ares", nick = "ares" },
    new Uye(){ id = 3, isim = "kaptan", nick = "kaptanTR" },
    new Uye(){ id = 4, isim = "arslan", nick = "arslan'" },
    new Uye(){ id = 5, isim = "reina", nick = "reina'" },
    new Uye(){ id = 6, isim = "Bürküt",nick="BÜRKÜT'"},
    new Uye(){ id = 7, isim = "Turkgokay", nick="Turkgokay"},
    new Uye(){ id = 8, isim = "boole",nick="boole'" },
};

Öncelikle bir döngü oluşturarak isim ve nickleri yazdıralım.

C#:
foreach (Uye uye in uyeler)
{
    Console.WriteLine($"isim:{uye.isim}, nick:{uye.nick}");
}
    
for (int i = 0; i < uyeler.Count; i++)
{
    Console.WriteLine("isim: "+ uyeler[i].isim + " nick:" + uyeler[i].nick);
}
for ve foreach kullanarak listelerdeki sabit değerlerimizi yazdırdık. Record kullanmamın sebebini sorarsanız dizinin içerisindeki değerler sabit olacağından örnek olarak yukarıdaki listeyi oluşturan kodların altına bu kodu yazarsanız çalışmayacaktır.

C#:
uyeler[1].nick = "xavier eckert";

Dizimizi oluşturduk fakat ben burada bir tık ileri gitmek istiyorum ve dinamik bir dizi yazmak istiyorum. Yani her çalıştırdığımızda rastgele sayıda ve elemanları rastgele olan bir int dizisi oluşturacağım. Rastgele değerler oluşturabilmek için Random sınıfını kullanacağım.

C#:
Random rnd = new Random();
int[] rastgeleSayilar = new int[rnd.next(1,10)]; // 1-10 arasında herhangi bir sayı kadar elemanı olacak bir dizi oluşturdum. Bu sayılar için yer açılacak ama boş olacak. Bu dizi dönmem ve yerleri sayılar ile doldurmam gerekiyor.
for(int i=0; i<rastgeleSayilar.Lenth;i++)
{
    sayilar[i] = rnd.Next(1,200) // her bir elemana 1-200 arasında herhangi bir sayı atayacak.
}

Bu dizi tamamen rastgele olacak fakat önce bir test edelim.
C#:
foreach (int sayi in sayilar)Console.Write($"{sayi}\t");
Döngülerin içerisinde tek bir satır kod kullanacak isek çengelli parantezi koymayabiliriz.


Şimdi LINQ girmeden iki diziden de istediğimiz sorguları oluşturalım
C#:
//Rastgele bir üyenin nickini alalım
var rastUye =uyeler[rnd.Next(uyeler.Count())].nick;
Console.WriteLine(sorgu1);
//Rastgele bir sayı alalım
var rastSayi = sayilar[rnd.Next(sayilar.Count())];
Console.WriteLine(rastSayi);

Evet şimdi LINQ ile istediğimiz değerleri bu dizilerden çekelim.
Öncelikle LINQ ile iki farklı şekilde sorgular oluşturabiliriz. Metot şeklinde veya sorgu cümlecikleri yazarak yapabiliriz. Ben şahsen metotları kullanmanızı öneririm fakat detaylı bir filtreleme işlemi yapmak istiyorsanız sorgu cümlecikleri şeklinde istediğiniz verileri elde edebilirsiniz.
Evet sorgu örneklerimize başlayalım. Ama başlamadan önce elimizde hangi listeler var onlara bir bakalım


Elemanları ve Eleman sayısı her çalıştırdığımızda değişen bir rastgeleSayilar adında sayı listemiz var.

Uye nesnelerini tutan bir uyeler adında bir listemiz var. Uye nesnesinin ise id,isim ve nick özellikleri var.


Şimdi öncelikle hangi verileri getireceğimizi cümle altında kod olarak açıklayalım.
  • rastgeleSayilar listesinin eleman sayısı
C#:
var sorgu1 = rastgeleSayilar.Count();
Console.WriteLine($"Liste eleman sayısı : {sorgu1}" );

  • rastgeleSayilar listesinden en büyük sayı
C#:
var sorgu2 = rastgeleSayilar.Max();
Console.WriteLine($"Listedeki en büyük eleman : {sorgu2}");

  • rastgeleSayilar listesinden en küçük sayı
C#:
var sorgu3 = rastgeleSayilar.Min();
Console.WriteLine($"Listedeki en küçük eleman : {sorgu3}");

  • rastgeleSayilar listesinden çift ve tek olan sayılar
C#:
List<int>cift = new List<int>();
List<int> tek = new List<int>();
foreach (int i in rastgeleSayilar)
{
    if (i %2== 0)cift.Add(i);
    else {  tek.Add(i); }
}
var jsonString = JsonSerializer.Serialize(tek);
var jsonString2 = JsonSerializer.Serialize(cift);
var jsonString3 = JsonSerializer.Serialize(rastgeleSayilar);
Console.WriteLine($"Tek Sayılar : {jsonString}");
Console.WriteLine($"Çift Sayılar : {jsonString2}");
Console.WriteLine($"Tüm sayılar : {jsonString3}");

  • rastgeleSayilar listesindeki sayıların toplamı ve çarpımı
C#:
Int64 toplam=0, carpim=1; // değerleri çok büyük olabileceğinden Int64 yaptım
foreach (int i in rastgeleSayilar)
{
toplam += i;
carpim *= i;
}
Console.WriteLine($"Sayıların toplamı: {toplam}");
Console.WriteLine($"Sayıların çarpımı: {carpim}");

  • rastgeleSayilar listesinden rastgele bir eleman
C#:
Random random = new Random();
var rastgeleEleman = rastgeleSayilar[random.Next(0, rastgeleSayilar.Length-1)];
Console.WriteLine(randEleman);

  • rastgeleSayilar listesinden belirtilen aralıkta bulunan sayılar ve sayısı
C#:
var sorgu4 = rastgeleSayilar.Where(x => x > 25 && x < 100).ToList();
foreach (int i in sorgu4) Console.WriteLine($"{i}");

  • uyeler listesinin rastgele bir uye bilgileri
C#:
Random random1 = new Random();
var sorgu5 = uyeler[random1.Next(1, uyeler.Count)];
Console.WriteLine("Rastgele üye nick : "+sorgu5.nick);

  • uyeler listesinin nick özelliğinde istediğimiz harfi içeren uyelerin bilgileri
C#:
var sorgu6 = uyeler.Where(x => x.nick.Contains('a')).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu6)); //json şeklinde yazdırdık listeyi foreach ile de dönebilirsiniz. hatta dönelim
foreach (var istenenuye in sorgu6)
{
    Console.WriteLine(istenenuye);
}

eğer sadece bir üye arıyorsak böyle yazmalıyız.
C#:
var sorgu6_2 = uyeler.Where(x => x.nick.Contains('k')).FirstOrDefault();
Console.WriteLine(sorgu6_2);

  • uyeler listesinin istediğimiz id'ye sahip uyelerin bilgileri
C#:
var sorgu7 = uyeler.Where(x => x.id.Equals(3)).SingleOrDefault();
Console.WriteLine(sorgu7);

  • uyeler listesinin istediğimiz id'aralığındaki uyelerin bilgileri
C#:
var sorgu8 = uyeler.Where(x=>x.id >=1 && x.id <=6).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu8));

Bir iki örnekte sql sorgu tarzında yazalım.
C#:
var sorgu9 = (from uye in uyeler
where  uye.id==1 select uye).FirstOrDefault(); // bakın burada iki kısımı birleştirebiliyoruz.
var sorgu10 =
    from uye in uyeler
    join sayi in rastgeleSayilar on uye.id equals sayi select uye;
Console.WriteLine(JsonSerializer.Serialize(sorgu10));
// burada ise rastgeleSayilar içerisindeki bir değerin uyeler listesi içerisindeki bir id değerine denk geldiği değerleri döndür

Tüm Kodlar
C#:
using System.Text.Json;

IList<Uye> uyeler = new List<Uye>() {
new Uye(){ id = 1, isim = "mert", nick = "xaviereckert" },
new Uye(){ id = 2, isim = "ares", nick = "ares" },
new Uye(){ id = 3, isim = "kaptan", nick = "kaptanTR" },
new Uye(){ id = 4, isim = "arslan", nick = "arslan'" },
new Uye(){ id = 5, isim = "reina", nick = "reina'" },
new Uye(){ id = 6, isim = "Bürküt",nick="BÜRKÜT'"},
new Uye(){ id = 7, isim = "Turkgokay", nick="Turkgokay"},
new Uye(){ id = 8, isim = "boole",nick="boole'" },
    };
////foreach (Uye uye in uyeler)
////{
////    Console.WriteLine($"isim:{uye.isim}, nick:{uye.nick}");
////}


//for (int i = 0; i < uyeler.Count; i++)
//{
//    Console.WriteLine("isim: "+ uyeler[i].isim + " nick:" + uyeler[i].nick);
//}
//sabit bir dizi oluşturduk.
//şimdi ikinci bir dizi oluşturalım. Bu liste dinamik olacak yani liste sayısını ve içerisindeki sayıları bilemeyeceğiz.
Random rnd = new Random(); // Rastgele sayılar oluşan nesnemizi oluşturdk
int[] rastgeleSayilar = new int[rnd.Next(1, 10)]; // 1 ila 10 arasında herhangi bir sayı kadar int dizisi oluşturduk.
for (int i = 0; i < rastgeleSayilar.Length; i++) rastgeleSayilar[i] = rnd.Next(1, 200);
//foreach (int sayi in sayilar)Console.Write($"{sayi}\t");

foreach (int i in rastgeleSayilar) Console.WriteLine($"{i}");

//Method ile sorgular yazalım
//var rastUye = uyeler[rnd.Next(uyeler.Count())].nick; Console.WriteLine(rastUye);
//var rastSayi = sayilar[rnd.Next(sayilar.Count())];Console.WriteLine(rastSayi);

//var sorgu2 = (from uye in uyeler
//              where uye.id.Equals(rnd.Next(1, 8))
//              select uye.nick).FirstOrDefault();

//Console.WriteLine(sorgu1.GetType());
Console.WriteLine("------------------------------");
//Console.WriteLine(sorgu2);

//var sorgu = sayilar.Where(p=> p>=800).ToList(); foreach (var s in sorgu)Console.WriteLine(s);
//foreach (var item in sayilar)
//{
//    Console.Write($"{item} \t");
//}




//1 - rastgeleSayilar listesinin eleman sayısı
var sorgu1 = rastgeleSayilar.Count();
Console.WriteLine($"Liste eleman sayısı : {sorgu1}" );
//2- rastgeleSayilar listesinden en büyük sayı
var sorgu2 = rastgeleSayilar.Max();
Console.WriteLine($"Listedeki en büyük eleman : {sorgu2}");
//3- rastgeleSayilar listesinden en küçük sayı
var sorgu3 = rastgeleSayilar.Min();
Console.WriteLine($"Listedeki en küçük eleman : {sorgu3}");

//4- rastgeleSayilar listesinden çift ve tek olan sayılar
List<int>cift = new List<int>();
List<int> tek = new List<int>();
foreach (int i in rastgeleSayilar)
{
    if (i %2== 0)cift.Add(i);
    else {  tek.Add(i); }
}
var jsonString = JsonSerializer.Serialize(tek);
var jsonString2 = JsonSerializer.Serialize(cift);
var jsonString3 = JsonSerializer.Serialize(rastgeleSayilar);
Console.WriteLine($"Tek Sayılar : {jsonString}");
Console.WriteLine($"Çift Sayılar : {jsonString2}");
Console.WriteLine($"Tüm sayılar : {jsonString3}");
//5- rastgeleSayilar listesindeki sayıların toplamı ve çarpımı
Int64 toplam=0, carpim=1;
foreach (int i in rastgeleSayilar)
{
    toplam += i;
    carpim *= i;
}
Console.WriteLine($"Sayıların toplamı: {toplam}");
Console.WriteLine($"Sayıların çarpımı: {carpim}");
Console.WriteLine("-----------------------------------------------------");
//6- rastgeleSayilar listesinden rastgele bir eleman
Random random = new Random();
var randEleman = rastgeleSayilar[random.Next(0, rastgeleSayilar.Length-1)];
Console.WriteLine(randEleman);
//7- rastgeleSayilar listesinden belirtilen aralıkta bulunan sayılar ve sayısı
var sorgu4 = rastgeleSayilar.Where(x => x > 25 && x < 100).ToList();
foreach (int i in sorgu4) Console.WriteLine($"{i}");

Console.WriteLine("-----------------------------------------------------");
//1- uyeler listesinin rastgele bir uye bilgileri
Random random1 = new Random();
var sorgu5 = uyeler[random1.Next(1, uyeler.Count)];
Console.WriteLine("Rastgele üye nick : "+sorgu5.nick);

Console.WriteLine("-----------------------------------------------------");
//2- uyeler listesinin nick özelliğinde istediğimiz harfi içeren uyelerin bilgileri
var sorgu6 = uyeler.Where(x => x.nick.Contains('a')).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu6)); //json şeklinde yazdırdık listeyi foreach ile de dönebilirsiniz. Hatta dönelim
foreach (var istenenuye in sorgu6)
{
    Console.WriteLine(istenenuye);
}
// eğer sadece bir üye arıyorsak böyle yazmalıyız.
var sorgu6_2 = uyeler.Where(x => x.nick.Contains('k')).FirstOrDefault();
Console.WriteLine(sorgu6_2);
//3- uyeler listesinin istediğimiz id'ye sahip uyelerin bilgileri
var sorgu7 = uyeler.Where(x => x.id.Equals(3)).SingleOrDefault();
Console.WriteLine(sorgu7);
//4- uyeler listesinin istediğimiz id'aralığındaki uyelerin bilgileri
var sorgu8 = uyeler.Where(x=>x.id >=1 && x.id <=6).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu8));



var sorgu9 =
    (from uye in uyeler
    where  uye.id==1 select uye).FirstOrDefault();

var sorgu10 = from uye in uyeler
               join sayi in rastgeleSayilar on uye.id equals sayi select uye;
Console.WriteLine(JsonSerializer.Serialize(sorgu10));

record Uye // Class'tan farklı olarak sabit bir yapı olarak atadım. Bilginiz yok ise Class'tan farkı yok.
{
    public int id { get; init; }
    public string isim { get; init; }
    public string nick { get; init; }

    public override string ToString()
    {
        return $"id: {id}, isim: {isim}, nick: {nick}";
    }
}

Araştırmanız için First, FirstOrDefault ve Single, SingleOrDefault farkları nelerdir diye sorarak topu size atıyorum. Eğer yanlış bir kelime ya da üslup kullandıysam affedin. İyi çalışmalar
 

Avalanche1

Hunter
14 Kas 2022
116
43
LINQ Nedir?
Açılımı Language-Integrated Query olan LINQ, veri kaynaklarına erişim ve filtreleme gibi işleri yapabildiğimiz bir sorgu dilidir.
LINQ Objeler, SQL, XML için kullanabiliriz. Aslında IEnumerable arayüzünü implemente eden, IEnumerable nesneler koleksiyonu için LINQ sorgularını kullanabiliriz. Bu tanımlar kafanızı karıştırabilir ama örneklerle kafanızdaki soruları gidermeye çalışacağım.

20-11.jpg
Öncelikle LINQ sorgularını kullanabilmek için
C#:
using System.Linq;
projenizin en üstüne yazarak LINQ kullanmaya başlayabilirsiniz.

En başta iki şekilde LINQ sorgularını kullanabiliriz. Öncelikle bir veri kümesi oluşturalım .
Tabi önce liste oluşturmadan Uye adında bir sınıf oluşturuyorum.


C#:
record Uye // Class'tan farklı olarak sabit bir yapı olarak atadım. Bilginiz yok ise Class'tan farkı yok diyebiliriz.
{
    public int id{ get; init; }
    public string isim { get; init; }
    public string nick { get; init; }
    public override string ToString() // ToString() metodunu burada üzerine yazıyoruz. Yani string veri tipine dönüşüm yapılırsa aşağıda belirtilen şekilde yazı dönüşecek.
    {
        return $"id: {id}, isim: {isim}, nick: {nick}";
    }
}
Şimdi bu üyeleri interface içerisinde oluşturup veri kümemi oluşturuyorum.
C#:
IList<Uye> uyeler = new List<Uye>() {
    new Uye(){ id = 1, isim = "mert", nick = "xaviereckert" },
    new Uye(){ id = 2, isim = "ares", nick = "ares" },
    new Uye(){ id = 3, isim = "kaptan", nick = "kaptanTR" },
    new Uye(){ id = 4, isim = "arslan", nick = "arslan'" },
    new Uye(){ id = 5, isim = "reina", nick = "reina'" },
    new Uye(){ id = 6, isim = "Bürküt",nick="BÜRKÜT'"},
    new Uye(){ id = 7, isim = "Turkgokay", nick="Turkgokay"},
    new Uye(){ id = 8, isim = "boole",nick="boole'" },
};

Öncelikle bir döngü oluşturarak isim ve nickleri yazdıralım.

C#:
foreach (Uye uye in uyeler)
{
    Console.WriteLine($"isim:{uye.isim}, nick:{uye.nick}");
}
    
for (int i = 0; i < uyeler.Count; i++)
{
    Console.WriteLine("isim: "+ uyeler[i].isim + " nick:" + uyeler[i].nick);
}
for ve foreach kullanarak listelerdeki sabit değerlerimizi yazdırdık. Record kullanmamın sebebini sorarsanız dizinin içerisindeki değerler sabit olacağından örnek olarak yukarıdaki listeyi oluşturan kodların altına bu kodu yazarsanız çalışmayacaktır.

C#:
uyeler[1].nick = "xavier eckert";

Dizimizi oluşturduk fakat ben burada bir tık ileri gitmek istiyorum ve dinamik bir dizi yazmak istiyorum. Yani her çalıştırdığımızda rastgele sayıda ve elemanları rastgele olan bir int dizisi oluşturacağım. Rastgele değerler oluşturabilmek için Random sınıfını kullanacağım.

C#:
Random rnd = new Random();
int[] rastgeleSayilar = new int[rnd.next(1,10)]; // 1-10 arasında herhangi bir sayı kadar elemanı olacak bir dizi oluşturdum. Bu sayılar için yer açılacak ama boş olacak. Bu dizi dönmem ve yerleri sayılar ile doldurmam gerekiyor.
for(int i=0; i<rastgeleSayilar.Lenth;i++)
{
    sayilar[i] = rnd.Next(1,200) // her bir elemana 1-200 arasında herhangi bir sayı atayacak.
}

Bu dizi tamamen rastgele olacak fakat önce bir test edelim.
C#:
foreach (int sayi in sayilar)Console.Write($"{sayi}\t");
Döngülerin içerisinde tek bir satır kod kullanacak isek çengelli parantezi koymayabiliriz.


Şimdi LINQ girmeden iki diziden de istediğimiz sorguları oluşturalım
C#:
//Rastgele bir üyenin nickini alalım
var rastUye =uyeler[rnd.Next(uyeler.Count())].nick;
Console.WriteLine(sorgu1);
//Rastgele bir sayı alalım
var rastSayi = sayilar[rnd.Next(sayilar.Count())];
Console.WriteLine(rastSayi);

Evet şimdi LINQ ile istediğimiz değerleri bu dizilerden çekelim.
Öncelikle LINQ ile iki farklı şekilde sorgular oluşturabiliriz. Metot şeklinde veya sorgu cümlecikleri yazarak yapabiliriz. Ben şahsen metotları kullanmanızı öneririm fakat detaylı bir filtreleme işlemi yapmak istiyorsanız sorgu cümlecikleri şeklinde istediğiniz verileri elde edebilirsiniz.
Evet sorgu örneklerimize başlayalım. Ama başlamadan önce elimizde hangi listeler var onlara bir bakalım


Elemanları ve Eleman sayısı her çalıştırdığımızda değişen bir rastgeleSayilar adında sayı listemiz var.

Uye nesnelerini tutan bir uyeler adında bir listemiz var. Uye nesnesinin ise id,isim ve nick özellikleri var.


Şimdi öncelikle hangi verileri getireceğimizi cümle altında kod olarak açıklayalım.
  • rastgeleSayilar listesinin eleman sayısı
C#:
var sorgu1 = rastgeleSayilar.Count();
Console.WriteLine($"Liste eleman sayısı : {sorgu1}" );

  • rastgeleSayilar listesinden en büyük sayı
C#:
var sorgu2 = rastgeleSayilar.Max();
Console.WriteLine($"Listedeki en büyük eleman : {sorgu2}");

  • rastgeleSayilar listesinden en küçük sayı
C#:
var sorgu3 = rastgeleSayilar.Min();
Console.WriteLine($"Listedeki en küçük eleman : {sorgu3}");

  • rastgeleSayilar listesinden çift ve tek olan sayılar
C#:
List<int>cift = new List<int>();
List<int> tek = new List<int>();
foreach (int i in rastgeleSayilar)
{
    if (i %2== 0)cift.Add(i);
    else {  tek.Add(i); }
}
var jsonString = JsonSerializer.Serialize(tek);
var jsonString2 = JsonSerializer.Serialize(cift);
var jsonString3 = JsonSerializer.Serialize(rastgeleSayilar);
Console.WriteLine($"Tek Sayılar : {jsonString}");
Console.WriteLine($"Çift Sayılar : {jsonString2}");
Console.WriteLine($"Tüm sayılar : {jsonString3}");

  • rastgeleSayilar listesindeki sayıların toplamı ve çarpımı
C#:
Int64 toplam=0, carpim=1; // değerleri çok büyük olabileceğinden Int64 yaptım
foreach (int i in rastgeleSayilar)
{
toplam += i;
carpim *= i;
}
Console.WriteLine($"Sayıların toplamı: {toplam}");
Console.WriteLine($"Sayıların çarpımı: {carpim}");

  • rastgeleSayilar listesinden rastgele bir eleman
C#:
Random random = new Random();
var rastgeleEleman = rastgeleSayilar[random.Next(0, rastgeleSayilar.Length-1)];
Console.WriteLine(randEleman);

  • rastgeleSayilar listesinden belirtilen aralıkta bulunan sayılar ve sayısı
C#:
var sorgu4 = rastgeleSayilar.Where(x => x > 25 && x < 100).ToList();
foreach (int i in sorgu4) Console.WriteLine($"{i}");

  • uyeler listesinin rastgele bir uye bilgileri
C#:
Random random1 = new Random();
var sorgu5 = uyeler[random1.Next(1, uyeler.Count)];
Console.WriteLine("Rastgele üye nick : "+sorgu5.nick);

  • uyeler listesinin nick özelliğinde istediğimiz harfi içeren uyelerin bilgileri
C#:
var sorgu6 = uyeler.Where(x => x.nick.Contains('a')).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu6)); //json şeklinde yazdırdık listeyi foreach ile de dönebilirsiniz. hatta dönelim
foreach (var istenenuye in sorgu6)
{
    Console.WriteLine(istenenuye);
}

eğer sadece bir üye arıyorsak böyle yazmalıyız.
C#:
var sorgu6_2 = uyeler.Where(x => x.nick.Contains('k')).FirstOrDefault();
Console.WriteLine(sorgu6_2);

  • uyeler listesinin istediğimiz id'ye sahip uyelerin bilgileri
C#:
var sorgu7 = uyeler.Where(x => x.id.Equals(3)).SingleOrDefault();
Console.WriteLine(sorgu7);

  • uyeler listesinin istediğimiz id'aralığındaki uyelerin bilgileri
C#:
var sorgu8 = uyeler.Where(x=>x.id >=1 && x.id <=6).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu8));

Bir iki örnekte sql sorgu tarzında yazalım.
C#:
var sorgu9 = (from uye in uyeler
where  uye.id==1 select uye).FirstOrDefault(); // bakın burada iki kısımı birleştirebiliyoruz.
var sorgu10 =
    from uye in uyeler
    join sayi in rastgeleSayilar on uye.id equals sayi select uye;
Console.WriteLine(JsonSerializer.Serialize(sorgu10));
// burada ise rastgeleSayilar içerisindeki bir değerin uyeler listesi içerisindeki bir id değerine denk geldiği değerleri döndür

Tüm Kodlar
C#:
using System.Text.Json;

IList<Uye> uyeler = new List<Uye>() {
new Uye(){ id = 1, isim = "mert", nick = "xaviereckert" },
new Uye(){ id = 2, isim = "ares", nick = "ares" },
new Uye(){ id = 3, isim = "kaptan", nick = "kaptanTR" },
new Uye(){ id = 4, isim = "arslan", nick = "arslan'" },
new Uye(){ id = 5, isim = "reina", nick = "reina'" },
new Uye(){ id = 6, isim = "Bürküt",nick="BÜRKÜT'"},
new Uye(){ id = 7, isim = "Turkgokay", nick="Turkgokay"},
new Uye(){ id = 8, isim = "boole",nick="boole'" },
    };
////foreach (Uye uye in uyeler)
////{
////    Console.WriteLine($"isim:{uye.isim}, nick:{uye.nick}");
////}


//for (int i = 0; i < uyeler.Count; i++)
//{
//    Console.WriteLine("isim: "+ uyeler[i].isim + " nick:" + uyeler[i].nick);
//}
//sabit bir dizi oluşturduk.
//şimdi ikinci bir dizi oluşturalım. Bu liste dinamik olacak yani liste sayısını ve içerisindeki sayıları bilemeyeceğiz.
Random rnd = new Random(); // Rastgele sayılar oluşan nesnemizi oluşturdk
int[] rastgeleSayilar = new int[rnd.Next(1, 10)]; // 1 ila 10 arasında herhangi bir sayı kadar int dizisi oluşturduk.
for (int i = 0; i < rastgeleSayilar.Length; i++) rastgeleSayilar[i] = rnd.Next(1, 200);
//foreach (int sayi in sayilar)Console.Write($"{sayi}\t");

foreach (int i in rastgeleSayilar) Console.WriteLine($"{i}");

//Method ile sorgular yazalım
//var rastUye = uyeler[rnd.Next(uyeler.Count())].nick; Console.WriteLine(rastUye);
//var rastSayi = sayilar[rnd.Next(sayilar.Count())];Console.WriteLine(rastSayi);

//var sorgu2 = (from uye in uyeler
//              where uye.id.Equals(rnd.Next(1, 8))
//              select uye.nick).FirstOrDefault();

//Console.WriteLine(sorgu1.GetType());
Console.WriteLine("------------------------------");
//Console.WriteLine(sorgu2);

//var sorgu = sayilar.Where(p=> p>=800).ToList(); foreach (var s in sorgu)Console.WriteLine(s);
//foreach (var item in sayilar)
//{
//    Console.Write($"{item} \t");
//}




//1 - rastgeleSayilar listesinin eleman sayısı
var sorgu1 = rastgeleSayilar.Count();
Console.WriteLine($"Liste eleman sayısı : {sorgu1}" );
//2- rastgeleSayilar listesinden en büyük sayı
var sorgu2 = rastgeleSayilar.Max();
Console.WriteLine($"Listedeki en büyük eleman : {sorgu2}");
//3- rastgeleSayilar listesinden en küçük sayı
var sorgu3 = rastgeleSayilar.Min();
Console.WriteLine($"Listedeki en küçük eleman : {sorgu3}");

//4- rastgeleSayilar listesinden çift ve tek olan sayılar
List<int>cift = new List<int>();
List<int> tek = new List<int>();
foreach (int i in rastgeleSayilar)
{
    if (i %2== 0)cift.Add(i);
    else {  tek.Add(i); }
}
var jsonString = JsonSerializer.Serialize(tek);
var jsonString2 = JsonSerializer.Serialize(cift);
var jsonString3 = JsonSerializer.Serialize(rastgeleSayilar);
Console.WriteLine($"Tek Sayılar : {jsonString}");
Console.WriteLine($"Çift Sayılar : {jsonString2}");
Console.WriteLine($"Tüm sayılar : {jsonString3}");
//5- rastgeleSayilar listesindeki sayıların toplamı ve çarpımı
Int64 toplam=0, carpim=1;
foreach (int i in rastgeleSayilar)
{
    toplam += i;
    carpim *= i;
}
Console.WriteLine($"Sayıların toplamı: {toplam}");
Console.WriteLine($"Sayıların çarpımı: {carpim}");
Console.WriteLine("-----------------------------------------------------");
//6- rastgeleSayilar listesinden rastgele bir eleman
Random random = new Random();
var randEleman = rastgeleSayilar[random.Next(0, rastgeleSayilar.Length-1)];
Console.WriteLine(randEleman);
//7- rastgeleSayilar listesinden belirtilen aralıkta bulunan sayılar ve sayısı
var sorgu4 = rastgeleSayilar.Where(x => x > 25 && x < 100).ToList();
foreach (int i in sorgu4) Console.WriteLine($"{i}");

Console.WriteLine("-----------------------------------------------------");
//1- uyeler listesinin rastgele bir uye bilgileri
Random random1 = new Random();
var sorgu5 = uyeler[random1.Next(1, uyeler.Count)];
Console.WriteLine("Rastgele üye nick : "+sorgu5.nick);

Console.WriteLine("-----------------------------------------------------");
//2- uyeler listesinin nick özelliğinde istediğimiz harfi içeren uyelerin bilgileri
var sorgu6 = uyeler.Where(x => x.nick.Contains('a')).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu6)); //json şeklinde yazdırdık listeyi foreach ile de dönebilirsiniz. Hatta dönelim
foreach (var istenenuye in sorgu6)
{
    Console.WriteLine(istenenuye);
}
// eğer sadece bir üye arıyorsak böyle yazmalıyız.
var sorgu6_2 = uyeler.Where(x => x.nick.Contains('k')).FirstOrDefault();
Console.WriteLine(sorgu6_2);
//3- uyeler listesinin istediğimiz id'ye sahip uyelerin bilgileri
var sorgu7 = uyeler.Where(x => x.id.Equals(3)).SingleOrDefault();
Console.WriteLine(sorgu7);
//4- uyeler listesinin istediğimiz id'aralığındaki uyelerin bilgileri
var sorgu8 = uyeler.Where(x=>x.id >=1 && x.id <=6).ToList();
Console.WriteLine(JsonSerializer.Serialize(sorgu8));



var sorgu9 =
    (from uye in uyeler
    where  uye.id==1 select uye).FirstOrDefault();

var sorgu10 = from uye in uyeler
               join sayi in rastgeleSayilar on uye.id equals sayi select uye;
Console.WriteLine(JsonSerializer.Serialize(sorgu10));

record Uye // Class'tan farklı olarak sabit bir yapı olarak atadım. Bilginiz yok ise Class'tan farkı yok.
{
    public int id { get; init; }
    public string isim { get; init; }
    public string nick { get; init; }

    public override string ToString()
    {
        return $"id: {id}, isim: {isim}, nick: {nick}";
    }
}

Araştırmanız için First, FirstOrDefault ve Single, SingleOrDefault farkları nelerdir diye sorarak topu size atıyorum. Eğer yanlış bir kelime ya da üslup kullandıysam affedin. İyi çalışmalar
eline sağlık abi
 

BeoWulf007

Kıdemli Üye
19 Haz 2013
2,760
506
24
Praise The Fool
Linq biraz karışık gözükebilir ama özünde çok basit bir şey ve normalde manuel olarak yaptığımız bir çok şeyi dilde tümleşik getiren bir methodlar topluluğu. Daha doğrusu şuanki hali öyle, eskiden kendine özel bir sorgu syntax'ı vardı. Gerçi hala geriye dönük uyumluluk sebebiyle var ama kullanılmıyor.

Olay şu ki Linq'i efektif bir şekilde kullanabilmek veya anlayabilmek için bilmeniz gereken başka şeyler de var.

Örneğin "delegate nedir" başlıca bilmeniz gereken şey bu.
İkinci olarak lambda expression nedir.

Bunları kendiniz de araştırabilirsiniz ancak örnek vermek gerekirse delegate'ler aslında içinde method barındırabilen değişken tipidir desek yanlış olmaz. Yani tıpkı string, int gibi methodlarda parametre isterken ya sen bana direk tanımlanmış method ver diyebiliyorsunuz.

Lambda expression ise yukarıdaki özellik için bir kolay söz dizimi. Parametre olarak method istiyor demiştik, bir method yazıp da verebileceğiniz gibi tek satırlık basit ve hızlı anonim methodlar tanımlamanızı kolaylaştıran bir yöntem.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.