Sql Server‘da belli bir veritabanında en büyük tabloları bulmak için aşağıdaki sorguyu çalıştırabiliriz;
DECLARE @TabloBoyutlari TABLE (TabloAdi VARCHAR(50), SatirSayisi INT, AyrilmisAlan VARCHAR(50), KullanilanAlan VARCHAR(50), IndexBoyu VARCHAR(50), KullanilmayanAlan VARCHAR(50))
INSERT INTO @TabloBoyutlari EXECUTE sp_MSforeachtable ‘sp_spaceused [?]’
SELECT TOP 10 * FROM @TabloBoyutlari ORDER BY CONVERT(INT, REPLACE(AyrilmisAlan, ‘ KB’, ‘’)) DESC
Bu sorgu sayesinde ilgili veritabanındaki tabloların,
İlgili tablo için aşağıdaki eşitlik her zaman doğrudur;
Kullanılan Alanı + Index Alanı + Kullanılmayan Alanı = Ayrılmış Alan
Benim bilgisayarımdaki AdventureWorks2008R2 örnek veritabanında yukarıdaki sorguyu çalıştırdığımda, şöyle bir sonuç alıyorum;
Aşağıdaki kod bloğunu çalıştırdığımızda ekran çıktımız nasıl olur?
private static string Degisken = “Ilk Deger”;
public static string Test() { return Degisken = “Ikinci Degisken”; }
public static void Main(string[] args) { Console.WriteLine(Degisken);
Console.WriteLine(Test());
Console.WriteLine(Degisken);
Console.ReadLine(); }</pre>
Sorunun doğru cevabı için;
Console çıktısı aşağıdaki gibi olacaktır;
Ilk Deger Ikinci Degisken Ikinci Degisken
MSDN’de (=) operatörü atamalarının nasıl yapıldığını okursanız, yukarıdaki sonuç anlamlı olacaktır.
Aşağıdaki basit örnekte oluşan durum, aslında aynı;
b = a = "engin polat"; Önce *a değişkenine* **engin polat** değeri atanacak. Sonra *b değişkenine*, **a değişkeninin değeri** atanacaktır. **MSDN'den alıntı : ***The assignment operator (=) stores the value of its right-hand operand in the storage location, property, or indexer denoted by its left-hand operand and returns the value as its result. The operands must be of the same type (or the right-hand operand must be implicitly convertible to the type of the left-hand operand).*
Windows Forms uygulamalarında Form‘un gölge efektine sahip olmasını istiyorsak, öncelikle Form‘un FormBorderStyle özelliğini None yapmalıyız.
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;</pre>
Form sınıfının CreateParams özelliğini override etmemiz gerekiyor. CreateParams özelliği geriye CreateParams tipinde bir nesne döndürür.
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ClassStyle |= 0x20000; return cp; } }
CreateParams sınıfının ClassStyle özelliğine 0x20000 değerini ekliyoruz. Böylece formumuz çalışmaya başladığında etrafında gölge gözüküyor.
Form üzerine çok fazla kontrol eklediğimizde, özellikle eğer kontroller hafızada çok yer kaplayan 3.parti kontrollerden ise; formumuzda titreme diyebileceğimiz bir efekt oluşmaya başlar.
Çoğu zaman bu durum rahatsızlık oluşturma derecesine kadar varır.
Bu sorunu çözmek için, kontrollerin DoubleBuffered özelliğini true değerine ayarlamamız gerekmektedir.
Fakat DoubleBuffered özelliği Form sınıfının değil Control sınıfının bir özelliği olduğundan dolayı, Form’un titremesini gidermek için kullanamayız.
Form sınıfının CreateParams özelliğinde bu sorunu da çözebiliriz;
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } }
Bu sefer CreateParams sınıfının ExStyle özelliğine 0x02000000 değerini eklememiz gerekiyor.
Örnek uygulamanın tüm kodu;
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ClassStyle |= 0x20000; cp.ExStyle |= 0x02000000; return cp; } }
Elimizdeki bir dizide, belli bir elemandan kaç adet olduğunu bulmamız gerekebilir.
Bunu yapmanın programatik olarak en kolay yolu LINQ sorgusu yazmaktır.
Örneğin aşağıdaki Extension Method, LINQ sorgusu ile aranan elemandan, ilgili listede kaç adet olduğu sonucunu döndürür;
public static int CountTimes< T >(this List< T > list, T item) { return ((from t in list where t.Equals(item) select t).Count()); }</pre>
Örnek kullanım;
using System; using System.Linq; using System.Collections.Generic; public static class Program { static void Main(string[] args) { var list1 = new List< int >() { 1, 2, 3, 4, 5, 6, 7, 7, 8, 9 }; var list2 = new List< string >() { "a", "b", "b", "b", "c", "d", "e", "f" }; Console.WriteLine("Birinci listede 7, " + list1.CountTimes(7) + " adet var"); Console.WriteLine("İkinci listede b, " + list2.CountTimes("b") + " adet var"); Console.ReadLine(); } public static int CountTimes< T >(this List< T > list, T item) { return ((from t in list where t.Equals(item) select t).Count()); } }
Yukarıdaki örnek kodu çalıştırdığınızda, şöyle bir sonuç almanız lazım;
Birinci listede 7, 2 adet var İkinci listede b, 3 adet var
Bowling skorlarını hesaplayan bir uygulama yazıyoruz.
2 oyuncunun 3 oyunda aldığı skorları hesaplayan aşağıdaki kodu yazdık ve çalıştırdık.
Fakat rakamlarda bir terslik var sanki. Sizce problem nedir ve nasıl düzeltebiliriz?
using System;
class Program { static void Main(string[] args) { int[,] PuanTablosu = { {101, 128, 143}, {123, 115, 116} };
int OyuncuPuan = 0;
for (int iLoop = 0; iLoop < = PuanTablosu.GetUpperBound(0); iLoop++)
{
for (int yLoop = 0; yLoop <= PuanTablosu.GetUpperBound(1); yLoop++)
{
OyuncuPuan += PuanTablosu[iLoop, yLoop];
}
Console.WriteLine("Oyuncu {0} skor: {1}", iLoop + 1, OyuncuPuan);
}
Console.ReadLine();
} }</pre>
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484