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()
}
二等兵