2011-07-10 23 views
5

Başlığın muhtemelen daha açıklayıcı/daha iyi bir şekilde ifade edilmiş olabileceğini biliyorum, ancak en iyi ihtimalle gelebiliyordum. Metodu parametre olarak geçirme yöntemi

Şu anda, aşağıda belirtilenler gibi bakıyor yöntemlerden bir sürü bir sınıf var:

 private static void UpdateArtists() 
     { 
      artists.Clear(); 
      foreach (AudioInfo entry in library_entries) 
      { 
       artists.Add(entry.Artist, entry); 
      } 
     } 

     private static void UpdateAlbums() 
     { 
      albums.Clear(); 
      foreach (AudioInfo entry in library_entries) 
      { 
       albums.Add(entry.Album, entry); 
      } 
     } 

     private static void UpdateGenres() 
     { 
      genres.Clear(); 
      foreach (AudioInfo entry in library_entries) 
      { 
       genres.Add(entry.Genre, entry); 
      } 
     } 

     private static void UpdateYears() 
     { 
      years.Clear(); 
      foreach (AudioInfo entry in library_entries) 
      { 
       years.Add(entry.Year, entry); 
      } 
     } 

Söylemeye gerek, bu çok yorucu olduğu onlarca yazma. Bu yüzden bunu basitleştirmek ve böyle bir yöntem şey yapmak mümkün olup olmadığını merak ediyorum:

 private static void Update(Dictionary<string, AudioInfo> dictionary, AudioInfo.Property property) 
    { 
     dictionary.Clear(); 
     foreach (AudioInfo entry in library_entries) 
     { 
      dictionary.Add(entry.property, entry); 
     } 
     //Where "property" is a property in the AudioInfo-class. 
    } 

o yapılabilir mi ve eğer; Nasıl?

Teşekkürler!

+0

"Ref" 'e ihtiyacınız olmadığını unutmayın, sınıflar her zaman referans olarak iletilir. –

+0

Heh, tabi ki haklısın. Bütün gece oturduğunuzda aldığınız şey budur. – Heidenreich

+0

olası bir kopyası [Bir metodun bir özelliği olarak bir sınıfın özelliğini nasıl geçirebilirim?] (Http://stackoverflow.com/questions/1178574/how-can-i-pass-a-property-of-a -class-as-a-parameter-of-a-yöntem) – nawfal

cevap

15

Böyle şeyler yapmanız gerekiyorsa, sınıfınızda bazı tasarım hataları var gibi görünüyor.

private static void Update(Dictionary<string, AudioInfo> dictionary, Func<AudioInfo, string> func) 
{ 
    dictionary.Clear(); 
    foreach (AudioInfo entry in library_entries) 
    { 
     dictionary.Add(func(entry), entry); 
    } 
} 

Ve kullanımıdır: yine de çözüm

Ayrıca
Update(years, x => x.Year); 

size sadece yazabilirsiniz herhangi yöntemler yerine aramanın, daha kolay şekilde kullanabilirsiniz:

years = library_entries.ToDictionary(x => x.Year, x => x); 

Sözlüğünüzle bağlantılı herhangi bir etkinlikiniz yoksa.

Ve bir şey daha var - aynı anahtar sözcüklerle farklı öğeleri ekleyemezsiniz. Sizin durumunuzda farklı AudioInfo nesneleriniz aynı Year, Genre e.t.c.

+1

Sözlükü "ref" ile geçmek zorunda değilsiniz. –

+0

Evet, haklısınız, sadece imzayı sorudan kopyaladım. – oxilumin

+0

Aslında, her anahtar için bir öğe listesi olan özel bir OneToManyDictionary var. Bir yinelenen anahtar eklerseniz, değeri anahtarla ilişkilendirilmiş listeye ekler. Düşüncemi basitleştirdiğimi ve ihtiyaç duyulandan daha fazla karışıklıktan kaçınmak için düzenli bir Sözlük kullanacağımı düşündüm: d. Bu söyleniyor, tahmin Func sürümü ile gideceğim. Teşekkürler! Daha kolay bir yol için – Heidenreich

İlgili konular