2012-10-15 3 views
1

두 가지 방법이 거의 같습니다. 상태 OR 상태 및 schoolType을 기반으로 List<XmlNode>을 얻은 다음 IEnumerable<KeyValuePair<string,string>>으로 구별 된 주문을 반환합니다. 나는 그들이 리팩토링 될 수 있다는 것을 알고 있지만 어떤 타입의 매개 변수가 메서드 반환 (각 메서드의 마지막 줄)에 대한 linq 문이어야하는지 결정하는 데 어려움을 겪고 있습니다.두 가지 방법을 하나로 리팩터링하십시오.

미리 도움을 주셔서 감사합니다.

private IEnumerable<KeyValuePair<string, string>> getAreaDropDownDataSource() { 
    StateInfoXmlDocument stateInfoXmlDocument = new StateInfoXmlDocument(); 
    string schoolTypeXmlPath = string.Format(STATE_AND_SCHOOL_TYPE_XML_PATH, StateOfInterest, ConnectionsLearningSchoolType); 
    var schoolNodes = new List<XmlNode>(stateInfoXmlDocument.SelectNodes(schoolTypeXmlPath).Cast<XmlNode>()); 
    return schoolNodes.Select(x => new KeyValuePair<string, string>(x.Attributes["idLocation"].Value, x.Value)).OrderBy(x => x.Key).Distinct(); 
} 

private IEnumerable<KeyValuePair<string, string>> getStateOfInterestDropDownDataSource() { 
    StateInfoXmlDocument stateInfoXmlDocument = new StateInfoXmlDocument(); 
    string schoolTypeXmlPath = string.Format(SCHOOL_TYPE_XML_PATH, ConnectionsLearningSchoolType); 
    var schoolNodes = new List<XmlNode>(stateInfoXmlDocument.SelectNodes(schoolTypeXmlPath).Cast<XmlNode>()); 
    return schoolNodes.Select(x => new KeyValuePair<string, string>(x.Attributes["stateCode"].Value, x.Attributes["stateName"].Value)).OrderBy(x => x.Key).Distinct(); 
} 

답변

4

메소드/속성을 분리하기 위해 노드를 추출합니다. 또한이 유형의 다른 선택기를 사용할 수 있습니다

private IEnumerable<KeyValuePair<string, string>> GetAreaDropDownDataSource() 
{ 
    return SchoolNodes.Union(StateNodes) 
      .Select(x => new KeyValuePair<string, string>(x.Attributes["idLocation"].Value, x.Value)) 
      .OrderBy(x => x.Key) 
      .Distinct(); 
} 

private IEnumerable<KeyValuePair<string, string>> GetStateOfInterestDropDownDataSource() 
{ 
    return SchoolNodes 
     .Select(x => new KeyValuePair<string, string>(x.Attributes["stateCode"].Value, x.Attributes["stateName"].Value)) 
     .OrderBy(x => x.Key) 
     .Distinct(); 
} 

: 지역 노드를 검색하기위한 학교 및 상태 노드의

private List<XmlNode> GetNodes(string xPath) 
{ 
    XmlDocument stateInfoXmlDocument = new XmlDocument(); 
    return new List<XmlNode>(stateInfoXmlDocument.SelectNodes(xPath) 
               .Cast<XmlNode>()); 
} 

private List<XmlNode> SchoolNodes 
{ 
    get { return GetNodes(String.Format(SCHOOL_PATH, LearningSchoolType)); } 
} 

private List<XmlNode> StateNodes 
{ 
    get { return GetNodes(String.Format(STATE_PATH, StateOfInterest)); } 
} 

사용 조합 : 나는 또한 학교와 상태 노드를 추출하는 다른 속성/메소드를 가지고하는 것이 좋습니다 Func<XmlNode, KeyValuePair<string, string>> 및 데이터 소스를 작성합니다 메소드에 전달합니다

나는 그들이 둘 모두 IEnumerable<KeyValuePair<string,string>>를 반환하는 동안 같은 느낌
private IEnumerable<KeyValuePair<string, string>> GetDropDownDataSource(
     List<XmlNode> nodes, 
     Func<XmlNode, KeyValuePair<string, string>> selector) 
{ 
    return nodes.Select(selector) 
       .OrderBy(x => x.Key) 
       .Distinct(); 
} 
+0

은'schoolTypeXmlPath'는 OP의 두 방법 ... –

+0

@lc마다 다르다. 고마워, 그걸 알아 채지 못 했어. 속성에서 메소드 –

+0

로 변경되었습니다. 감사합니다. 여기에 몇 가지 좋은 아이디어가 있습니다. :) – bflemi3

2

,이 방법들은 의미 적으로 내용면에서 매우 다르다. 따라서 두 가지 방법을 사용하고 반복되는 코드 만 추출하여 세 번째 코드로 만듭니다. 뭔가 같이 :

private List<XmlNode> getSchoolNodes(string xmlPath, params object[] values) 
{ 
    StateInfoXmlDocument stateInfoXmlDocument = new StateInfoXmlDocument(); 
    string schoolTypeXmlPath = string.Format(xmlPath, values); 
    return new List<XmlNode>(stateInfoXmlDocument.SelectNodes(schoolTypeXmlPath).Cast<XmlNode>()); 
} 

private IEnumerable<KeyValuePair<string, string>> getAreaDropDownDataSource() { 
    var schoolNodes = getSchoolNodes(STATE_AND_SCHOOL_TYPE_XML_PATH, StateOfInterest, ConnectionsLearningSchoolType);   
    return schoolNodes.Select(x => new KeyValuePair<string, string>(x.Attributes["idLocation"].Value, x.Value)).OrderBy(x => x.Key).Distinct(); 
} 

private IEnumerable<KeyValuePair<string, string>> getStateOfInterestDropDownDataSource() { 
    var schoolNodes = getSchoolNodes(SCHOOL_TYPE_XML_PATH, ConnectionsLearningSchoolType); 
    return schoolNodes.Select(x => new KeyValuePair<string, string>(x.Attributes["stateCode"].Value, x.Attributes["stateName"].Value)).OrderBy(x => x.Key).Distinct(); 
} 

당신은 다음처럼 멀리 갈 수 있지만,이 문제를 overengineering 두 Func의 호출 오버 헤드가 생성되어 있는지 궁금해.

private IEnumerable<KeyValuePair<string, string>> getSchoolNodeDataSource(Func<XmlNode, string> keyFunc, Func<XmlNode, string> valueFunc, string xmlPath, params object[] values) 
{ 
    StateInfoXmlDocument stateInfoXmlDocument = new StateInfoXmlDocument(); 
    string schoolTypeXmlPath = string.Format(xmlPath, values); 
    var schoolNodes = new List<XmlNode>(stateInfoXmlDocument.SelectNodes(schoolTypeXmlPath).Cast<XmlNode>()); 
    return schoolNodes.Select(x => new KeyValuePair<string, string>(keyFunc(x), valueFunc(x))).OrderBy(x => x.Key).Distinct(); 
} 

private IEnumerable<KeyValuePair<string, string>> getAreaDropDownDataSource() { 
    return getSchoolNodeDataSource(x => x.Attributes["idLocation"].Value, x => x.Value, 
     STATE_AND_SCHOOL_TYPE_XML_PATH, StateOfInterest, ConnectionsLearningSchoolType);   
} 

private IEnumerable<KeyValuePair<string, string>> getStateOfInterestDropDownDataSource() { 
    return getSchoolNodeDataSource(x => x.Attributes["stateCode"].Value, x => x.Attributes["stateName"].Value, 
     SCHOOL_TYPE_XML_PATH, ConnectionsLearningSchoolType); 
} 
0
private IEnumerable<KeyValuePair<string, string>> Foo(
    string schoolTypeXmlPath, 
    Func<T, string> keySelector, 
    Func<T, string> valueSelector) 
{ 
    return (
     from XmlNode x in StateInfoXmlDocument().SelectNodes(schoolTypeXmlPath) 
     orderby x.Key 
     select new KeyValuePair<string, string>(keySelector(x), valueSelector(x))) 
     .Distinct() 
} 

private IEnumerable<KeyValuePair<string, string>> getAreaDropDownDataSource() { 
    return Foo(
     string.Format(STATE_AND_SCHOOL_TYPE_XML_PATH, StateOfInterest, ConnectionsLearningSchoolType), 
     x => x.Attributes["idLocation"].Value, 
     x => x.Value); 
} 

private IEnumerable<KeyValuePair<string, string>> getStateOfInterestDropDownDataSource() { 
    return Foo(
     string.Format(SCHOOL_TYPE_XML_PATH, ConnectionsLearningSchoolType), 
     x => x.Attributes["stateCode"].Value, 
     x => x.Attributes["stateName"].Value); 
} 
관련 문제