2011-07-10 41 views
5

Tôi biết tiêu đề có thể có phần mô tả/mô tả tốt hơn một chút, nhưng đó là điều tốt nhất tôi có thể nghĩ ra.Chuyển thuộc tính dưới dạng thông số trong phương thức

Hiện nay tôi có một lớp học với rất nhiều các phương pháp tìm kiếm giống như những người dưới đây:

 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); 
      } 
     } 

Không cần phải nói, viết hàng chục trong số này là rất mệt mỏi. Vì vậy, tôi đã tự hỏi nếu nó có thể đơn giản hóa nó và làm cho một phương pháp một cái gì đó như thế này:

 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. 
    } 

Đó là doable, và nếu nó được; làm sao?

Cảm ơn!

+0

Lưu ý rằng bạn không cần 'ref' chút nào, các lớp luôn được chuyển qua tham chiếu. –

+0

Heh, bạn đã đúng. Đó là những gì bạn nhận được khi bạn ngồi suốt đêm. – Heidenreich

+0

có thể trùng lặp của [Làm thế nào tôi có thể vượt qua một tài sản của một lớp như một tham số của một phương pháp?] (Http://stackoverflow.com/questions/1178574/how-can-i-pass-a-property-of-a -class-as-a-parameter-of-a-method) – nawfal

Trả lời

15

Dường như bạn có một số lỗi thiết kế trong lớp học của mình nếu bạn cần làm những việc như vậy. tuy nhiên, giải pháp là:

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); 
    } 
} 

Và việc sử dụng là:

Update(years, x => x.Year); 

Ngoài ra bạn có thể sử dụng cách dễ dàng hơn, thay vì gọi bất kỳ phương pháp bạn có thể chỉ cần viết:

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

Nếu bạn không có bất kỳ sự kiện nào, được liên kết với từ điển của bạn.

Và một điều nữa cần thực hiện - bạn không thể thêm các phần tử khác nhau có cùng các khóa vào từ điển. Trong trường hợp của bạn, có vẻ như bạn có các đối tượng khác nhau AudioInfo với cùng một số Year, Genre e.t.c.

+1

Bạn không phải chuyển từ điển bằng 'ref'. –

+0

Có, bạn nói đúng, tôi vừa sao chép chữ ký từ câu hỏi. – oxilumin

+0

Thực ra tôi có OneToManyDictionary tùy chỉnh, có một danh sách các mục cho mỗi khóa. Nếu tôi thêm khóa trùng lặp, nó sẽ thêm giá trị vào danh sách được liên kết với khóa. Tôi nghĩ rằng tôi đơn giản hóa câu hỏi của mình và chỉ sử dụng một từ điển thông thường để tránh nhầm lẫn nhiều hơn cần thiết: d. Điều đó đang được nói, đoán tôi sẽ đi với phiên bản Func. Cảm ơn! – Heidenreich

Các vấn đề liên quan