Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将两个方法重构为一个_C#_Linq_Refactoring - Fatal编程技术网

C# 将两个方法重构为一个

C# 将两个方法重构为一个,c#,linq,refactoring,C#,Linq,Refactoring,我有两种方法几乎可以做同样的事情。它们根据状态或状态和学校类型得到一个列表,然后返回一个不同的、有序的IEnumerable。我知道它们可以重构,但我正在努力确定在方法返回(每个方法的最后一行)中linq语句的参数应该是什么类型 我提前感谢你的帮助 private IEnumerable<KeyValuePair<string, string>> getAreaDropDownDataSource() { StateInfoXmlDocument stateInf

我有两种方法几乎可以做同样的事情。它们根据状态或状态和学校类型得到一个
列表,然后返回一个不同的、有序的
IEnumerable
。我知道它们可以重构,但我正在努力确定在方法返回(每个方法的最后一行)中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();
}
private IEnumerable getAreaDropDownDataSource(){
StateInfoXmlDocument StateInfoXmlDocument=新StateInfoXmlDocument();
string schoolTypeXmlPath=string.Format(STATE_和_SCHOOL_TYPE_XML_PATH、StateOfInterest、connectionLearningSchoolType);
var schoolNodes=新列表(stateInfoXmlDocument.SelectNodes(schoolTypeXmlPath.Cast());
返回schoolNodes.Select(x=>newkeyValuePair(x.Attributes[“idLocation”].Value,x.Value)).OrderBy(x=>x.Key).Distinct();
}
private IEnumerable getStateOfInterestDropDownDataSource(){
StateInfoXmlDocument StateInfoXmlDocument=新StateInfoXmlDocument();
string schoolTypeXmlPath=string.Format(学校类型XML路径,连接学习学校类型);
var schoolNodes=新列表(stateInfoXmlDocument.SelectNodes(schoolTypeXmlPath.Cast());
返回schoolNodes.Select(x=>newkeyValuePair(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)); }
}   
私有列表GetNodes(字符串xPath)
{
XmlDocument stateInfoXmlDocument=新的XmlDocument();
返回新列表(stateInfoXmlDocument.SelectNodes(xPath)
.Cast());
}
私有列表节点
{
获取{return GetNodes(String.Format(SCHOOL_PATH,LearningSchoolType));}
}
私有列表状态节点
{
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();
}
private IEnumerable GetAreaDropDownDataSource()
{
返回SchoolNodes.Union(StateNodes)
.Select(x=>newkeyvaluepair(x.Attributes[“idLocation”].Value,x.Value))
.OrderBy(x=>x.Key)
.Distinct();
}
private IEnumerable GetStateOfInterestDropDownDataSource()
{
返回学校节点
.Select(x=>newkeyValuePair(x.Attributes[“stateCode”].Value,x.Attributes[“stateName”].Value))
.OrderBy(x=>x.Key)
.Distinct();
}
您还可以使用
Func
类型的不同选择器,并将它们传递给将创建数据源的方法:

private IEnumerable<KeyValuePair<string, string>> GetDropDownDataSource(
        List<XmlNode> nodes,
        Func<XmlNode, KeyValuePair<string, string>> selector)
{
    return nodes.Select(selector)
                .OrderBy(x => x.Key)
                .Distinct();
}
private IEnumerable GetDropDownDataSource(
列出节点,
Func选择器)
{
返回节点。选择(选择器)
.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)); }
}   
私有列表GetNodes(字符串xPath)
{
XmlDocument stateInfoXmlDocument=新的XmlDocument();
返回新列表(stateInfoXmlDocument.SelectNodes(xPath)
.Cast());
}
私有列表节点
{
获取{return GetNodes(String.Format(SCHOOL_PATH,LearningSchoolType));}
}
私有列表状态节点
{
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();
}
private IEnumerable GetAreaDropDownDataSource()
{
返回SchoolNodes.Union(StateNodes)
.Select(x=>newkeyvaluepair(x.Attributes[“idLocation”].Value,x.Value))
.OrderBy(x=>x.Key)
.Distinct();
}
private IEnumerable GetStateOfInterestDropDownDataSource()
{
返回学校节点
.Select(x=>newkeyValuePair(x.Attributes[“stateCode”].Value,x.Attributes[“stateName”].Value))
.OrderBy(x=>x.Key)
.Distinct();
}
您还可以使用
Func
类型的不同选择器,并将它们传递给将创建数据源的方法:

private IEnumerable<KeyValuePair<string, string>> GetDropDownDataSource(
        List<XmlNode> nodes,
        Func<XmlNode, KeyValuePair<string, string>> selector)
{
    return nodes.Select(selector)
                .OrderBy(x => x.Key)
                .Distinct();
}
private IEnumerable GetDropDownDataSource(
列出节点,
Func选择器)
{
返回节点。选择(选择器)
.OrderBy(x=>x.Key)
.Distinct();
}

我觉得当它们都返回一个
IEnumerable
时,这些方法在内容上语义上是完全不同的。因此,我将保留这两个方法,并仅将重复的代码提取到第三个方法。比如:

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

我觉得虽然它们都返回一个
IEnumerable
,但这些方法在内容上语义上是完全不同的。因此,我将保留这两个方法,并仅将重复的代码提取到第三个方法。比如:

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();
}
private IEnumerable Foo(
字符串类型XmlPath,
Func键选择器,
Func值选择器)
{
返回(
从StateInfoXmlDocument()中的XmlNode x选择节点(schoolTypeXmlPath)
orderby x.Key
选择新的KeyValuePair(keySelector(x)、valueSelector(x)))
.Distinct()
}
私有IEnumerable getAreaDropDownDataSource(){
返回Foo(
格式(状态和学校类型、XML路径、兴趣状态、连接学习学校类型),
x=>x.Attributes[“idLocation”].Value,
x=>x.值);
}
private IEnumerable getStateOfInterestDropDownDataSource(){
返回Foo(
格式(学校类型、XML路径、连接学习学校类型),
x=>x.Attributes[“stateCode”].Value,
x=>x.Attributes[“stateName”].Value);
}
私有IEnumerable Foo(
字符串类型XmlPath,
Func键选择器,
Func值选择器)
{
返回(
从StateInfoXmlDocument()中的XmlNode x选择节点(schoolTypeXmlPath)
orderby x.Key
选择新的KeyValuePair(keySelector(x)、valueSelector(x)))
.Distinct()
}
二等兵