1

ほとんど同じことを行う2つの方法があります。List<XmlNode>state OR state と schoolType に基づいて を取得し、個別の順序付けられた を返し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

3 に答える 3

4

別のメソッド/プロパティに取得するノードを抽出します。また、学校と州のノードを抽出するためのさまざまなプロパティ/方法を用意することをお勧めします。

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

エリアノードを取得するには、学校ノードと州ノードの結合を使用します。

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

また、タイプのさまざまなセレクターを使用Func<XmlNode, 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();
}
于 2012-10-15T15:24:38.150 に答える
2

どちらも を返しているように感じIEnumerable<KeyValuePair<string,string>>ますが、これらのメソッドは意味的に内容がまったく異なります。したがって、私は 2 つの方法を保持し、繰り返されるコードのみを 3 番目に抽出します。何かのようなもの:

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

Func次のようにすることもできますが、これは問題を過剰に設計し、2 つの sを呼び出すオーバーヘッドを作成しているのではないかと思います。

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);
}
于 2012-10-15T15:28:49.077 に答える
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);
}
于 2012-10-15T15:44:40.503 に答える