Интерфейсы к основным советам по предотвращению дублирования кода в c #
В моем проекте есть несколько типов:
{
List<string> strings;
ColoredString[] coloredStrings;
MulticoloredString[] multicoloredStrings;
}
В разных частях у меня одни и те же задачи, называемые "FindMaxWidth":
{
int maxWidth1 = strings.Max((string str) => str.Length);
int maxWidth2 = coloredStrings.Max((ColoredString cs) => cs.ToString().Length);
int maxWidth3 = multicoloredStrings.Max((MulticoloredString ms) => ms.ToString().Length);
}
Я думаю, что иметь тот же вызов делегата Finc<> - плохой стиль. Но в С # я не могу реализовать настраиваемый интерфейс, такой как «Расширяемый», для базовых классов (я имею в виду строку). Это заставляет меня написать что-то такое:
public static Method(string[] strings1, IEnumerable<ColoredString> strings2, IEnumerable<MulticoloredString> strings3) {
int maxWidth1 = strings.GetMaxLength();
int maxWidth2 = strings2.GetMaxLength();
int maxWidth3 = strings3.GetMaxLength();
}
public static GetMaxLength(IEnumerable<string> strings) {
return strings.Max((string str) => str.Length);
}
public interface ILengthable {
public Length { get; }
}
public static GetMaxLength<T>(this IEnumerable<T> enm) where T: ILengthable {
return enm.Max((T t => t.Length)
}
Мне не нужен действительно четкий код, но я думаю, что у меня все еще есть дублирование кода, худший из плохого стиля кодирования, не так ли ...?:
>> return strings.Max((string str) => str.Length);
>> return enm.Max((T t => t.Length)
Где я хочу взять строку в "Т". У меня вопрос: что мне делать, когда мне нужно привязать базовые типы к интерфейсам?