- 16 Tem 2016
- 1,651
- 308
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.
C#:
using System.Linq;
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}";
}
}
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);
}
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");
Ş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
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
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