C# FileInfo ile Alınan İtemleri Listbox'daki İtemler ile Karşılaştırmak?

Hello

Hectopat
Katılım
2 Temmuz 2014
Mesajlar
555
Makaleler
2
Daha fazla  
Cinsiyet
Erkek
Merhabalar, sorunum Listbox içinde olan bir eleman dışardan tekrar eklenmeye çalışılınca aynı olan itemleri es geçmesi yani elemesi. Uğraştım ama bir türlü dışardan alınan itemler ile Listbox içindeki elemanları karşılaştıramadım. Yardımlarınızı bekliyorum. @AhmetAksoy
Kod:
 private void addMusic_Click(object sender, RoutedEventArgs e)
        {

            System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog();
            System.Windows.Forms.DialogResult result = dialog.ShowDialog();

            if (dialog.SelectedPath != "")
            {
                DirectoryInfo direcInfo = new DirectoryInfo(dialog.SelectedPath);
                FileInfo[] files = direcInfo.GetFiles("*.mp3");


                foreach (FileInfo fileInfo in files)
                {
                    listbox2.Items.Add(new Dosya(System.IO.Path.GetFileNameWithoutExtension(fileInfo.Name), fileInfo.FullName));
                  
                    if (listbox2.Items.Contains(files) == true) //Karşılaştırmaya çalıştığım yer
                    {
                                            
                        listbox2.Items.Clear(); // Eğer karşılaştırdaysa aynı olan varsa listeyi temizleyecekti. Ancak bana aynı olanları silmesi lazım :)
                    }
                      
                

                }
            }
        }
 
Son düzenleme:
Listbox elemanları Dosya sınıfında siz içinde FileInfo sınıfı var mı ona bakıyorsunuz. O nedenle her türlü false döndürecektir. Ayrıca döndürmese bile elemesi yerine direk olan listeyi de temizlemeye çalışmışsınız.

Kod:
        private void addMusic_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog();
            System.Windows.Forms.DialogResult result = dialog.ShowDialog();

            if (dialog.SelectedPath != "")
            {
                DirectoryInfo direcInfo = new DirectoryInfo(dialog.SelectedPath);
                FileInfo[] files = direcInfo.GetFiles("*.mp3");


                foreach (FileInfo fileInfo in files)
                {
                    if (!listbox2.Items.Cast<Dosya>().Select(x => x.FileInfo).Contains(fileInfo.FullName))
                        listbox2.Items.Add(new Dosya(System.IO.Path.GetFileNameWithoutExtension(fileInfo.Name), fileInfo.FullName));
                }
            }
        }

Listbox.Items içindeki sınıfı program bilemeyeceği için Dosya sınıfına Cast yapıyorsunuz. MVVM yöntemini kullansaydınız direk Listbox'a bağlanan veri üzerinde işlem yapacağınız için Dosya sınıfında olduğunu bilecektik ve Cast yapmaya gerek kalmayacaktı. Cast yaptıktan sonra Select Linq komutu ile Dosya sınıfının sadece FileInfo özelliğini içeren listeye ulaşmış oluyorsunuz. Artık FileInfo.FullName yazısını içerip içermediğini kontrol edebilirsiniz. Eğer içermiyorsa ekleyeceksiniz, içeriyorsa bir şey yapmaya gerek yok, döngüdeki yeni eleman için işlem yapılacak.

Bu yöntem FileInfo.FullName özelliği her nesnede farklı olacağı için çalışır. Ama bu özellikte aynı yazıya sahip olabilecek farklı nesneler olabilseydi o zaman Dosya sınıfını komple karşılaştırmayı deneyebilirdiniz. Tabi bu durum için Dosya sınıfını FileInfo ile karşılaştırmak olduğu için Dosya sınıfına direk FileInfo sınıfını içeren özellik yazıp gene Select komutu ile o listeye ulaşıp FileInfo sınıfı üzerinden karşılaştırma yapabilirdiniz. Şu an için string sınıfı üzerinden karşılaştırma yaptık.

Ayrıca kendi yazdığınız sınıfı karşılaştırmak için sınıf içerisinde object sınıfından gelen Equals metodunu override yapıp kendi istediğiniz yola göre Dosya nesnelerinin kıyaslanmasını sağlayabilirsiniz. IEqualityComparer arayüzünden türeyen sınıf ile de Dosya sınıfında bu işi yapmak yerine dışarıda da karşılaştırma yöntemini belirleyebilirsiniz. Örneğin Contains yöntemi ek parametre olarak IEqualityComparer alıyor.
 
Son düzenleme:
Hocam öncelikle yardımınız için çok teşekkürler. Ben Cast<>'ın kullanımını anlıyamadım - daha önce hiç kullanmadım - . Cast<> ne işe yarıyor? Neden Where<> veya başka bir metod yerine Select<> kullandınız? Son olarak aşağıdaki satırda " =>" bu işaretin burdaki anlamı nedir?
Kod:
Select(x => x.FileInfo)
 
Cast yapmazsanız object olarak görecektir ve select içindeki x.Fileinfo derleme hatası verecektir. Cast yapınca ListBox.Items içinde Dosya sınıfından olmayan bir nesne varsa hata verecektir. ListBox'a veriyi siz eklediğiniz için ve dosya dışında başka bir şey eklenmeyeceğini bildiğiniz için null kontrolü yapmanıza gerek yok.

"=>" Bu işaret lambda ifadesi. Bol bol kullanın çok işe yarıyor.
Lambda İfadeleri (C# Programlama Kılavuzu)

Bu yazıyı okuyun güzel yazı olmuş.
turkegitim.net - Ders Notları - Lambda İfadeleri (Lambda Expressions)

Kod:
                foreach (FileInfo fileInfo in files)
                {
                    var yenidosya = from dosya in listbox2.Items.Cast<Dosya>()
                         
                                    select dosya.FileInfo;

                    if (!yenidosya.Contains(fileInfo.FullName))
                        listbox2.Items.Add(new Dosya(System.IO.Path.GetFileNameWithoutExtension(fileInfo.Name), fileInfo.FullName));
                }

Kod:
                foreach (FileInfo fileInfo in files)
                {
                    if (!(from dosya in listbox2.Items.Cast<Dosya>()
                          select dosya.FileInfo).Contains(fileInfo.FullName))
                        listbox2.Items.Add(new Dosya(System.IO.Path.GetFileNameWithoutExtension(fileInfo.Name), fileInfo.FullName));
                }

Bu iki şekilde yazmak yerine size söylediğim yöntem daha okunabilir ve kısa kodla aynı işlemi yapıyor.
 
Uyarı! Bu konu 9 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı