Listede Filtreleme Yapmanın İyi - Kötü - Çirkin Yolu

Bütün gün, dizilerde filtrelemeler yaptıktan sonra, bu konu ile ilgili bir yazı yazmaya karar verdim. Elimizde bir List<int> olsun, dizideki 0‘dan büyük rakamları döndüren fonksiyon yazmak istediğimizi varsayalım;

Önce Kötü Yol;

private static List<int> FiltrelemeninKotuYolu(List<int> t) { List<int> arrReturn = new List<int>(); foreach (int i in t) { if (i > 0) { arrReturn.Add(i); } } return arrReturn; }</pre> Umarım artık böyle kodlar yazmıyorsunuzdur!!..

Çirkin Yol;

Önce bir Predicate Function tanımlarız;

private static bool Karsilastir(int i)
{
    if (i > 0)
    {
        return true;
    }
    return false;
}

Sonra, Predicate Function‘ı kullanırız;

private static List<int> FiltrelemeninCirkinYolu(List<int> t)
{
    Predicate<int> pred = new Predicate<int>(Karsilastir);
    return t.FindAll(pred);
}

Kötü Yol‘dan daha doğru olduğu ortada, ama Güzel bir yol değil.

Son olarak İyi Yol;

private static List<int> FiltrelemeninIyiYolu(List<int> t)
{
    return t.FindAll(n => n > 0);
}

**İyi Yol** aslında sadece **Çirkin Yol**'un iyileştirilmiş hali. *Predicate Method* kullanacağımıza *Lambda Expression* kullanıyoruz. *n => n > 0* : **n**'nin **0**'dan büyük olduğu durumlar anlamına geliyor.

Bu kodda ne yanlış var? - 2

Aşağıdaki kod parçasını çalıştıralım. Sifir isimli değişkenin değerine baktığımızda 0 olduğunu görüyoruz.

List<int> arrListe = new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); int Sifir = arrListe.Find( delegate(int i) { return i == 0; } );

Listede 0 değeri yok!. Neden sonuç 0 dönüyor? Bu kodu nasıl düzeltebiliriz?

Sql Server'da En Meşgul Veritabanını Bulmak

Geçenlerde bir öğrencimin sorusu üzerine Sql Server’da en meşgul veritabanını nasıl bulabiliriz, sorusuna cevap arayacağız.

En meşgul veritabanı, muhtemelen en çok disk operasyonu yapan veritabanıdır diye düşünerek, en çok disk aktivitesinde bulunan veritabanını yakalamaya çalışmalıyız.

Sql Server ile ilgili aradığımız birçok sorunun cevabını DMV‘lerde olduğu için, öncelikle logical_read ve logical_write miktarlarını veren DMV bulmalıyız.

MSDN’de şu sayfadan detaylı bilgiye ulaşabileceğiniz SYS.DM_EXEC_QUERY_STATS, ihtiyacımız olan TOTAL_LOGICAL_READS, TOTAL_LOGICAL_WRITES, SQL_HANDLE isminde üç kolona sahip.

SQL_HANDLE kolonunda yer alan veriyi, veritabanını bulmak için kullanabiliriz. Yapmamız gereken SYS.DM_EXEC_SQL_TEXT DMF‘i ile CROSS JOIN işlemine tabi tutarak, DBID kolonuna erişmek. Böylece DB_NAME sistem fonksiyonu sayesinde veritabanının ismine ulaşabiliriz.

SELECT SUM(EQS.TOTAL_LOGICAL_READS) AS TOPLAM_OKUMA, SUM(EQS.TOTAL_LOGICAL_WRITES) AS TOPLAM_YAZMA, ISNULL(DB_NAME(EST.DBID), ‘AdhocSQL’) AS VERITABANI FROM SYS.DM_EXEC_QUERY_STATS AS EQS CROSS APPLY SYS.DM_EXEC_SQL_TEXT(EQS.SQL_HANDLE) AS EST GROUP BY DB_NAME(EST.DBID)

Sql Server'da Hash işlemi

Uygulamalarımızda verileri hash‘lemeye her zaman ihtiyaç duyarız. Verileri hash’lemek için kullanabileceğimiz birçok araç vardır.

Eğer veriyi veritabanı katmanında (Sql Server) hash’lemek istiyorsak, MSDN‘de şu sayfada bulunan makalede okuyabileceğiniz gibi HASHBYTES fonksiyonu ile  yapabiliriz.

HASHBYTES fonksiyonu iki parametre alır;

Algoritma: Hash’leme algoritması. Alabileceği değerler; MD2, MD4, MD5, SHA, SHA1

Veri: Hash işlemine tabi tutulacak veri

HASHBYTES fonksiyonu geriye VarBinary(8000) tipinde değer döndürür.

MD5 algoritması ile hash işlemi yapan örnek kod;

SELECT KULLANICI_KODU, KULLANICI_ADI, HASHBYTES(‘MD5’, KULLANICI_SIFRE) AS KULLANICI_SIFRE FROM T_KULLANICI WITH (NOLOCK)</pre>

CREATE PROCEDURE PR_KULLANICI_EKLE
(
    @KULLANICI_KODU VARCHAR(5),
    @KULLANICI_ADI VARCHAR(50),
    @KULLANICI_SIFRE VARCHAR(15)
)
AS
INSERT INTO T_KULLANICI
    (KULLANICI_KODU, KULLANICI_ADI, KULLANICI_SIFRE, KAYIT_TARIHI)
VALUES
    (@KULLANICI_KODU, @KULLANICI_ADI, HASHBYTES('MD5', @KULLANICI_SIFRE), GETDATE())

SELECT SCOPE_IDENTITY()
CREATE PROCEDURE PR_KULLANICI_LOGIN
(
    @KULLANICI_ADI VARCHAR(50),
    @KULLANICI_SIFRE VARCHAR(15)
)
AS
SELECT
    KULLANICI_KODU,
    KULLANICI_ADI,
    HASHBYTES('MD5', KULLANICI_SIFRE) AS KULLANICI_SIFRE
FROM
    T_KULLANICI WITH (NOLOCK)
WHERE
    KULLANICI_ADI = @KULLANICI_ADI AND
    KULLANICI_SIFRE = HASHBYTES('MD5', @KULLANICI_SIFRE)

Güvenlik ihtiyaçlarından ötürü kıymetli bilgilerin network'ten ulaşılmasını önlemek için, veriyi taşımadan önce **hash**'lemek isteyebilirsiniz. *HASHBYTES* fonksiyonu bu işin son derece kullanışlı gözüküyor.

***Not :** Yazıyı yazdıktan sonra gördüm ki, Emre Ayrılmaz şuradaki makalesinde aynı konuyu işlemiş, okunmasında fayda var.*

C# ile Kes-Kopyala-Yapıştır Olaylarını Fırlatan Textbox

.Net Framework’ün Textbox‘ı bir çok kullanışlı event‘i kullanımımıza sunmuştur. Böylece programcılar olarak kod yazmak için seçebileceğimiz geniş bir olay kütüphanesi vardır. Mesela TextChanged olayına ayrı, KeyDown olayına ayrı, KeyUp olayına ayrı kod yazabiliriz.

Fakat nedense, textbox’tan metin kopyalarken/keserken veya textbox’a metin yapıştırırken fırlatılan bir olay yoktur. Çeşitli sebeplerle projelerimizde Kes-Kopyala-Yapıştır olaylarını fırlatan bir textbox’a ihtiyaç duyabiliriz.

Textbox kontrolüne özel event’ler eklemek için, yeni bir class oluşturup, Textbox class’ından türemesini sağlamalıyız.

public partial class GelismisTextBox : TextBox { }</pre>

Windows‘un sunduğu Kes-Kopyala-Yapıştır olaylarını GelismisTextbox class’ımızda yönetebilmek için WndProc() method’unu override etmemiz lazım.

private const int WM_CUT = 0x0300;
private const int WM_COPY = 0x0301;
private const int WM_PASTE = 0x0302;

protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case WM_CUT:
            /// Kes komutu olayını fırlat
            break;
        case WM_COPY:
            /// Kopyala komutu olayını fırlat
            break;
        case WM_PASTE:
            /// Yapıştır komutu olayını fırlat
            break;
        default:
            base.WndProc(ref m);
            break;
    }
}

Şimdi yapmamız gereken, GelismisTextbox class’ımıza olayları fırlatacak kodu eklemek.

public class ClipboardEventArgs : EventArgs
{
    private string clipboardText;
    public string ClipboardText
    {
        get { return clipboardText; }
        set { clipboardText = value; }
    }

    public ClipboardEventArgs(string clipboardText)
    {
        this.clipboardText = clipboardText;
    }
}
public delegate void ClipboardEventHandler(object sender, ClipboardEventArgs e);

public event ClipboardEventHandler CutText;
public event ClipboardEventHandler CopiedText;
public event ClipboardEventHandler PastedText;

Artık GelismisTextbox kontrolünü projemizde kullanabiliriz. GelismisTextbox kontrolünde yapılacak Kes-Kopyala-Yapıştır işlemleri esnasında fırlatılacak olaylara ilişkin kodlarda yazabiliriz. Örneğin;

private void txtOrnek_CutText(object sender, ClipboardEventArgs e)
{
    MessageBox.Show("Gelişmiş Textbox'tan kesilen : " + e.ClipboardText);
}
private void txtOrnek_CopiedText(object sender, ClipboardEventArgs e)
{
    MessageBox.Show("Gelişmiş Textbox'tan kopyalanan : " + e.ClipboardText);
}
private void txtOrnek_PastedText(object sender, ClipboardEventArgs e)
{
    MessageBox.Show("Gelişmiş Textbox'a yapıştırılan : " + e.ClipboardText);
}

GelismisTexbox class’ının kodu;

public partial class GelismisTextBox : TextBox
{
    private const int WM_CUT = 0x0300;
    private const int WM_COPY = 0x0301;
    private const int WM_PASTE = 0x0302;

    public delegate void ClipboardEventHandler(object sender, ClipboardEventArgs e);

    public event ClipboardEventHandler CutText;
    public event ClipboardEventHandler CopiedText;
    public event ClipboardEventHandler PastedText;

    protected override void WndProc(ref Message m)
    {
        switch(m.Msg)
        {
            case WM_CUT:
                if (CutText != null)
                    CutText(this, new ClipboardEventArgs(this.SelectedText));
                break;
            case WM_COPY:
                if (CopiedText != null)
                    CopiedText(this, new ClipboardEventArgs(this.SelectedText));
                break;
            case WM_PASTE:
                if (PastedText != null)
                    PastedText(this, new ClipboardEventArgs(Clipboard.GetText()));
                break;
            default:
                base.WndProc(ref m);
                break;
        }
    }
}

public class ClipboardEventArgs : EventArgs
{
    private string clipboardText;
    public string ClipboardText
    {
        get { return clipboardText; }
        set { clipboardText = value; }
    }

    public ClipboardEventArgs(string clipboardText)
    {
        this.clipboardText = clipboardText;
    }
}


Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı