2013-11-01 2 views
1

У меня есть функция, которая просматривает список объектов (Жанр, Национальность и т. Д.). Он должен вернуть добавление определенного свойства (различно для каждого объекта). Я не могу изменить код этих перечисленных объектов (в DDL).C# code-duplication: property List treatment

Вот некоторые примеры того, что я должен сделать сейчас:

private String formatListString(List<Genre> list) 
    { 
     for (...) 
     { 
      str += list[i].Value; 
      ... 
     } 
     return str; 
    } 

    private String formatListString(List<Nationality> list) 
    { 
     for (...) 
     { 
      str += list[i].Code; 
      ... 
     } 
     return str; 
    } 

Как я могу сделать это в одной функции? Возможно, добавьте параметр в функцию, чтобы указать свойство, которое нужно использовать?

Спасибо.

+0

Возможно, вы можете передать делегат-селектор. Или перейдите в уже отфильтрованный список. В зависимости от того, что у вас нет, могут быть стандартные функции, такие как 'string.Concat' или' string.Join'. – CodesInChaos

+0

'String.Concat' может быть полезным расследованием. Но это зависит от того, какая дополнительная логика содержит ваш цикл. – knittl

ответ

1

Вы можете пройти в лямбда выбрать свойство, которое нужно:

private String formatListString<T>(List<T> list, Func<T, string> selector) 
    { 
     for (...) 
     { 
      str += selector(list[i]); 
      ... 
     } 
     return str; 
    } 

Вызвать следующее:

var genres = formatListString(genreList, x => x.Value); 
var nationalities = formatListString(nationalityList, x => x.Code); 

Параметр общего типа может быть автоматически выведен из вызова, поэтому вам не нужно указывать его явно (т. напишите formatListString<Genre>(genreList, x => x.Value);)

+0

Спасибо, это именно то, что мне нужно. – Nicolas

3
return String.Join("...", list.Select(o => o.Code)); 

Если это не будет работать для вас, вы могли бы использовать дженерики и лямбда:

private string FormatList<T>(IEnumerable<T> list, Func<T, String> prop) 
+1

Просто отметить, что 'String.Join' не получил перегрузки, которая принимает' IEnumerable 'до .NET 4 - если вы используете более раннюю версию фреймворка, вы можете вызвать' .ToArray() ', чтобы сделать это Работа. – Bridge

+0

String.Join() недостаточно для того, что я должен делать. Но ваше второе решение отлично работает с реализацией knittl. Спасибо – Nicolas