2016-01-26 2 views
2

Следующий код очень повторяющийся, но содержит очень незначительные различия в доступе к свойствам. Они изменяются между RM/FM/FE и PrimaryRM/PrimaryFM/PrimaryFE в зависимости от того, к какому столбцу относится GroupKeyGetter.Как можно упростить этот повторяющийся код?

Я не могу найти способ преобразования этого метода в метод, так что мне не нужно иметь этот массивный блок кода, но должен быть способ сделать это лучше ...

allRMsColumn.GroupKeyGetter = delegate(object rowObject) 
{ 
    var users = ((Tenant) rowObject).RMs.Trim().Split(new[] {", "}, StringSplitOptions.RemoveEmptyEntries); 

    return users.FirstOrDefault(user => GlobalSettings.Users.Find(x => x.Name == user && x.Selected) != null) ?? ((Tenant)rowObject).PrimaryRM; 
}; 

allFMsColumn.GroupKeyGetter = delegate (object rowObject) 
{ 
    var users = ((Tenant)rowObject).FMs.Trim().Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries); 

    return users.FirstOrDefault(user => GlobalSettings.Users.Find(x => x.Name == user && x.Selected) != null) ?? ((Tenant)rowObject).PrimaryFM; 
}; 

allFEsColumn.GroupKeyGetter = delegate (object rowObject) 
{ 
    var users = ((Tenant)rowObject).FEs.Trim().Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries); 

    return users.FirstOrDefault(user => GlobalSettings.Users.Find(x => x.Name == user && x.Selected) != null) ?? ((Tenant) rowObject).PrimaryFE; 
}; 

Любые идеи вообще?

+0

Существует распространенный тип между '' RMs', FMs' и 'FEs'? –

+0

@DStanley Это все строки, такие как 'PrimaryRM',' PrimaryFM', 'PrimaryFE' – JohnUbuntu

+1

Должно было догадаться, что из вызова' Trim() '. Благодарю. BTW 9 строк кода (исключая пробелы и пунктуации) не являются «массовыми» любыми способами. Вы можете улучшить повторное использование, но я сомневаюсь, что вы можете получить его на меньшее _lines_. –

ответ

1

Вы можете сделать вспомогательные методы для извлечения выбранных User, например:

private string GetFirstSelectedUser(string userList) { 
    var users = userList.Trim().Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries); 
    return users.FirstOrDefault(user => GlobalSettings.Users.Find(x => x.Name == user && x.Selected) != null); 
} 

В настоящее время все три делегата может быть закодирован так:

allRMsColumn.GroupKeyGetter = delegate(object rowObject) { 
    var renant = (Tenant) rowObject; 
    return GetFirstSelectedUser(tenant.RMs) ?? tenant.PrimaryRM; 
}; 

Если вы можете сделать реструктуризацию в Tenant и может группировать FEs с PrimaryFE, FMs с PrimaryFM и RMs с PrimaryRM, вы можете упростить свой встречный корыто еще дальше:

class GroupWithPrimary { 
    public string Group {get;} 
    public string Primary {get;} 
    public GroupWithPrimary(string group, string primary) { 
     Group = group; 
     Primary = primary; 
    } 
} 
private string GetFirstSelectedUser(GroupWithPrimary gp) { 
    var users = gp.Group.Trim().Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries); 
    return users.FirstOrDefault(user => GlobalSettings.Users.Find(x => x.Name == user && x.Selected) != null) ?? gp.Primary 
} 
allRMsColumn.GroupKeyGetter = delegate(object rowObject) { 
    return GetFirstSelectedUser(((Tenant)rowObject).RM); 
}; 
allFMsColumn.GroupKeyGetter = delegate(object rowObject) { 
    return GetFirstSelectedUser(((Tenant)rowObject).FM); 
}; 
allFEsColumn.GroupKeyGetter = delegate(object rowObject) { 
    return GetFirstSelectedUser(((Tenant)rowObject).FE); 
}; 
+0

Конечно, это немного меньше для каждого делегата, но я считаю, что это не совсем упрощает код. Количество строк на самом деле немного увеличивается. Разве нет способа просто передать все это методу? – JohnUbuntu

+0

@JohnUbuntu Этот подход подтолкнул логику, которую вы повторили три раза в виде синкле. Вы также можете передать значение по умолчанию, если хотите, и нажать '' 'в метод, но это не сильно изменится. Вся логика сейчас в одном месте, без повторения. Если вы могли бы объединить свои «RMs' +' PrimaryRM »,« FEs »+« PrimaryFE »и т. Д. В класс, то вы сможете упростить этот метод. – dasblinkenlight

+1

@JohnUbuntu Итак, каковы ваши критерии для «более простого»? Нет повторного кода, поэтому в моем уме это проще. Меньше строк кода не всегда лучше. –

0

Похоже, разница между этими тремя вариантами можно экстрагировать в funcs, например, так:

Func<object, object> CreateGroupKeyGetter(Func<Tenant, string> func1, 
      Func<Tenant, string> func2) 
{ 
    return rowObject=> 
      { 
       var users = func1(((Tenant) rowObject)).Trim().Split(new[] ", "}, StringSplitOptions.RemoveEmptyEntries); 

       return users.FirstOrDefault(user => GlobalSettings.Users.Find(x => x.Name == user && x.Selected) != null) ?? func2(((Tenant)rowObject)); 
      } 
} 

allRMsColumn.GroupKeyGetter = CreateGroupKeyGetter(t=>t.Rms, t=>t.PrimaryRm); 
allFMsColumn.GroupKeyGetter = CreateGroupKeyGetter(t=>t.Fms, t=>t.PrimaryFm); 
allFesColumn.GroupKeyGetter = CreateGroupKeyGetter(t=>t.Fes, t=>t.PrimaryFe); 



} 
+0

Это не работает. Что-то не так с funcs, и 'GroupKeyGetter' жалуется на невозможность конвертировать в GroupKeyGetterDelegate'. Как и идея. – JohnUbuntu

+0

Что такое 'GroupKeyGetterDelegate'? –

+0

Ну, у меня нет возможности получить точную подпись GroupKeyGetterDelegate, но вы можете исправить любые проблемы типа. Просто хотел дать вам пример того, как использовать функции более высокого порядка. Проголосуйте, если вам это нравится :) –

 Смежные вопросы

  • Нет связанных вопросов^_^