konu itibariyle öğrenmek amaçlı hazırlamış olduğum kaynak kodu paylaşıyorum
form üzerine 11 adet buton ve bir adet listbox koyarak sizde denemenizi yapabilirsiniz
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Linq;
using
System.Text;
using
System.Windows.Forms;
namespace
linq_olan
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
class ogrenciler
{
public int ogrenciid { get ;set ; }
public string ogrenciadsoyad { get ; set ; }
public int ogrenciyas { get ;set ; }
public bool aktif { get ;set ; }
}
class sinif
{
public string sinifadi { get ;set ; }
public int ogrenciid { get ;set ; }
}
class okul
{
public string okuladi { get ;set ; }
public string sinifadi { get ;set ; }
}
List <okul > okulum = new List <okul >()
{
new okul (){okuladi="al" ,sinifadi="1" },
new okul (){okuladi="sml" ,sinifadi="2" },
new okul (){okuladi="mel" ,sinifadi="3" }
};
List <sinif > sinifim = new List <sinif >()
{
new sinif (){ ogrenciid=1,sinifadi="1" },
new sinif (){ ogrenciid=2,sinifadi="2" },
new sinif (){ogrenciid =3,sinifadi="1" },
new sinif (){ogrenciid=4,sinifadi="2" },
new sinif (){ogrenciid=5,sinifadi="3" }
};
List <ogrenciler > liste = new List <ogrenciler >()
{
new ogrenciler (){
ogrenciid=1,ogrenciyas=12,ogrenciadsoyad="sade
dede" ,aktif=true
},
new ogrenciler (){
ogrenciid=2,ogrenciyas=13,ogrenciadsoyad="demir
demirkan" ,aktif=true
},
new ogrenciler (){
ogrenciid=3,ogrenciyas=14,ogrenciadsoyad="kemal
sers" ,aktif=false
},
new ogrenciler (){
ogrenciid=4,ogrenciyas=12,ogrenciadsoyad="fevzi
çalış" ,aktif=true
},
new ogrenciler (){
ogrenciid=5,ogrenciyas=13,ogrenciadsoyad="AHMET
yusuf" ,aktif=true
},
new ogrenciler (){ogrenciadsoyad="murat onur" ,ogrenciyas=12,aktif=true }
};
private void Form1_Load(object
sender, EventArgs e)
{
}
private void button1_Click(object
sender, EventArgs e)
{
//////Lambda
Expression (=>) kullanımı aktif olan oğrenci ve idsi bir olan gösterelim
////liste.Where(p=>p.Aktif…..)
ifadesinde artık p dediğimiz eleman liste isimli listemizde
////yer
alan her bir elemanı (Ogrenciler sınıfı
türünden elemanlar) temsil etmektedir.
////Dolayısıyla
p. İfadesi ile Ogrenciler sınıfına ait özellikleri görebilmekteyiz.
//// Sorgudan dönen elemanları da ogrenciler
isimli bir listeye aktarıyoruz. Linq sorguları
////IEnumerable<T>
türünden bir liste döndürdüğü için elemanlarımızı okumak için foreach döngüsü
//// ile yazabiliriz.
IEnumerable <ogrenciler > ogrenci = liste.Where(p =>
p.aktif && p.ogrenciid == 1);
foreach
(ogrenciler item in
ogrenci)
{
listBox1.Items.Add(item.ogrenciid
+ " " + item.ogrenciadsoyad + " " + item.ogrenciyas);
}
}
private void button2_Click(object
sender, EventArgs e)
{
//klasik
sorgu teknikleriyle yapacak olursak
var
ogrenci = from k in
liste
where k.aktif && k.ogrenciid == 4
select k;
foreach
(ogrenciler item in
ogrenci)
{
listBox1.Items.Add(item.ogrenciid + "
" + item.ogrenciadsoyad + " "
+ item.ogrenciyas);
}
}
private void button3_Click(object
sender, EventArgs e)
{
//sıralamak
için
int []
dizi = { 21, 43, 43, 67, 665, 34, 33, 5678, 6, 34, 86, 34 };
var
bolum = (from sayi in
dizi
orderby sayi
select sayi);
foreach
(var deger in
bolum)
{
listBox1.Items.Add(deger);
}
}
private void button4_Click(object
sender, EventArgs e)
{
string []
sehirler = { "samsun" , "amasya" , "ankara" ,"yozgat" , "sinop" ,"diyarbakır" , "istanbul" };
string []
sehirler2 = { "kayseri" , "malatya" , "izmir" ,"erzurum" , "antalya" };
//birleştirmek
için
var
sonuc = sehirler2.Concat(sehirler);
sonuc = (from
sayi in sonuc
select
sayi);
//var ara
= from sehir in sehirler
// join sehir2 in sehirler2 on sehir[0]
equals sehir2[0]
// select sehir + " " +
sehir2;
foreach
(var item in
sonuc)
{
listBox1.Items.Add(item);
}
}
private void button5_Click(object
sender, EventArgs e)
{
listBox1.Items.Clear();
}
private void button6_Click(object
sender, EventArgs e)
{
var
goster = from k in
liste
where k.ogrenciadsoyad[0] == 'A'
select k;
//select
k.ogrenciadsoyad; //foreach da item.ogrenciadsoyad yazmamak için
foreach
(var item in
goster)
{
listBox1.Items.Add(item.ogrenciadsoyad);
}
}
private void button7_Click(object
sender, EventArgs e)
{
// SelectMany Select ile seçim
yapmaya çalıştığımız koleksiyon içerisinde yer alan
// alanlardan biri gene koleksiyon
yapısında ise bu içteki koleksiyonun elemanlarına
// ulaşmak için iç içe iki
foreach döngüsü kullanmamız gerekir.
(Bizim liste isimli
// koleksiyonumuz göz önüne alınırsa
bu koleksiyonumuzun alanlarından ogrenciadsoyad alanı gene
// birden fazla elemana sahip bir
string dizisi olarak düşünülebilir.)
//Örneğin
liste isimli koleksiyonumuzdan ogrenciyas’si 12 olan kişimizin ad ve soyadını
görüntülemek
// istersek aşağıdaki sorguyu
kullanmamız gerekir.
var
goster = (from k in
liste
where k.ogrenciyas == 12
select
k.ogrenciadsoyad.Split(',' ));
/////Lambda
Expression (=>) kullanımı
var
sonuc=liste.Where(k=>k.ogrenciyas==13).Select(p=>p.ogrenciadsoyad.Split(',' ));
foreach
(var ogreniadsoyad in
sonuc)
{
foreach
(var item in
ogreniadsoyad)
{
listBox1.Items.Add(item);
}
}
}
private void button8_Click(object
sender, EventArgs e)
{
// Yukarıdaki sorgudan dönen koleksiyonun türü
Select kullandığımızdan dolayı
//IEnumerable<IEnumerable<string>>
türündendir. İç içe 2 adet IEnumerable tür
// olduğundan dolayı en içteki elemanlara
ulaşmak için iç içe 2 döngü
// kullanmamız gerekmektedir. Dıştaki döngü
ogreniadsoyadın tümünü dizi
// şeklinde elde ederken içteki döngü bu
elemanları tek tek ekrana yazmaktadır.
//Yukarıda
içi içe 2 foreach döngüsü kurarak yaptığımız işi SelectMany metodu tek başına
//
yapabilmektedir. Bu metod geriye IEnumerable<string> türünden bir sonuç
getirdiği için
// tek bir döngü ile tüm elemanlar elde
edilebilmektedir. Yani iç koleksiyonu da otomatik
// olarak parçalayabilmektedir.
var
sonuc=liste.Where(p=>p.ogrenciyas==12).SelectMany(k=>k.ogrenciadsoyad.Split(',' ));
foreach
(var item in
sonuc)
{
listBox1.Items.Add(item);
}
}
private void button9_Click(object
sender, EventArgs e)
{
//Join
operatörü, Sql sorgularımızda kullandığımız join operatörüne çok benzemektedir.
// Amaç iki ayrı koleksiyonu ID yapısındaki
ortak kolonları ile bağlamaktır.
//Örneğin
yukarıda tanımlamış olduğumuz koleksiyonlarımızdan sınıf ve öğrenciler
//isimli
koleksiyonlarımızı ele aldığımızda “öğrenciler” isimli koleksiyonumuzda
//ogrenciid
tanımlayan bilgileri, “sınıf” isimli koleksiyon ise öğrencilerin
// dahil olabilecekleri birimleri
tanımlamaktadır. Biz her bir öğrencinin adı ve
// sınıfının adını elde edebilmek için 2 adet
sorgu çalıştırmalıyız. Çünkü
// sınıf koleksiyonunda öğrencilerinin adı yer almaktadır
// . Her iki koleksiyonda da yer alan ve
ogrenciid kolonu üzerinden ikisini birbirin
//bağlayan
bir sorgu yazarsak istediğimiz sonucu elde edebiliriz.
//Aşağıdaki
sorguda şunu demek istiyoruz. “Bana sınıf koleksiyonunu be ogrenciler
// koleksiyonunu getir ama sınıf koleksiyonunda
yer alan ögrenciid kolonunun
// değeri
birimler koleksiyonun ögrenciid kolonunun değerine eşit olanları seçerek
getir.”
// Gelen sonuç ta bir nesne koleksiyonuna
atanmıştır. (select new ile Linq to Object yapılmıştır)
var
birlestir = from k in
liste
from p in sinifim
where k.ogrenciid == p.ogrenciid
select new {
ogrenciadvesoyadi
=k.ogrenciadsoyad,
sinifinadi=p.sinifadi
};
foreach
(var item in
birlestir)
{
listBox1.Items.Add("Sınıf adı=" + item.sinifinadi + " Oğrenci ad ve soyadı=" +
item.ogrenciadvesoyadi);
}
//Aynı
sorguyu join operatörü kullanarak çok daha pratik bir şekilde
gerçekleştirebiliriz
//Join
operatörü aynen SQL’deki iner join gibi çalışır. Her iki kayıt yığınındaki
eşleşen
//
kayıtları ele alarak ogrenciler koleksiyonundan ogrenciid’ye karşılık gelen
sinif’ini döndürür.
var
birlestir2=from k in
liste
join p in sinifim on k.ogrenciid equals
p.ogrenciid
select new
{
ogrenciadvesoyadi = k.ogrenciadsoyad,
sinifinadi =
p.sinifadi
};
foreach
(var item in
birlestir2)
{
listBox1.Items.Add("Sınıf adı=" +item.sinifinadi + " Oğrenci ad ve soyadı=" +
item.ogrenciadvesoyadi);
}
//Ekran çıktısında
3adet öğrenci listelenmiş murat onur
isimli ğrenci listelenmemiştir.
// Çünkü bu
öğrencinin ogrenciidsi silinmiştir. Join operatörü de Sql’deki iner join gibi
çalıştığından oğrenciler
// tablosundaki
kayıtlardan yalnızca sınıf ile eşleşenleri getirecektir.
}
private void button10_Click(object
sender, EventArgs e)
{
////GroupJoin
kullanımı
var
sonuc = from k in
liste
join p in sinifim on k.ogrenciid equals
p.ogrenciid into t
from s in t.DefaultIfEmpty()
select new {
ogrenciadvesoyadi =
k.ogrenciadsoyad,
ogrenciid = (s==null ) ? 0 : s.ogrenciid
//Yukarıdaki ifade ile eğer ogrencinin dahil olduğu
//ogrenci idi boş geliyorsa o, aksi halde ogrenciidsini
yazıyoruz
};
foreach
(var item in
sonuc)
{
listBox1.Items.Add("oğrenci id=" + item.ogrenciid + " Oğrenci ad ve soyadı=" +
item.ogrenciadvesoyadi);
}
}
private void button11_Click(object
sender, EventArgs e)
{
// GroupBy
//Bu
operatör Ienumerable türünden bir veri kümesi üzerinde belli bir kritere göre
kayıtları
//
gruplamaya yarar. Yapısı ve çalışma mantığı itibariyle Sql sorgularındaki
GroupBy kullanımı
// ile büyük benzerlikler göstermektedir.
IEnumerable<IGrouping<K,T>> türünden bir veri kümesi döndürür.
//IGrouping<K,T>
arayüzü IEnumerable<T> türünden miras almaktadır.
//public
interface IGrouping<K, T> : IEnumerable<T>
//{
// K Key { get; }
//}
//Bu
arayüz Key isminde readonly bir özellik içermektedir.
// Bu özellik yardımıyla gruplama sonucu elde
edeceğimiz elemanlara ulaşabiliriz
var
sayilarim = new int []
{ 2,65,89,59,5,9,654,7,5,66,52};
var
goster = from k in
sayilarim
group k by k % 6 into k2
select new {
kalan =k2.Key,
adet=k2.Count()
};
foreach
(var item in
goster)
{
listBox1.Items.Add( "6 ile bolündüğünde" + item.kalan+" veren " +item.adet+" mevcut" );
}
}
private void button12_Click(object
sender, EventArgs e)
{
var
goster = from k in
okulum
join p in sinifim on k.sinifadi equals
p.sinifadi
group p by p.sinifadiinto k
select new
{
sinifadi=k.Key,
adet=k.Count()
};
// okulum isimli koleksiyonumuz üzerinde
sinifadi isimlerini de bu koleksiyona bağladık.
//(join) Daha
sonra sinifadina göre verilerimizi
gruplayarak her gruba düşen öğrenci sayısını belirlemiş oluyoruz.
foreach
(var item in
goster)
{
listBox1.Items.Add(item.sinifadi + "
nolu sınıfta" + " " + item.adet + " kişi
mevcut" );
}
}
}
}