C# 使用几个if-else语句重构foreach循环
我有一个方法,我检查了几次C# 使用几个if-else语句重构foreach循环,c#,C#,我有一个方法,我检查了几次SPListItem的某个字段是否为null,然后为该属性写入默认值。有什么方法可以减少这个代码吗?多谢各位 public List<Models.EmployeeInfo> GetEmployeeInfo(SPListItemCollection splic) { List<Models.EmployeeInfo> listEmployeeInfo = new List<Models.EmployeeInfo
SPListItem
的某个字段是否为null
,然后为该属性写入默认值。有什么方法可以减少这个代码吗?多谢各位
public List<Models.EmployeeInfo> GetEmployeeInfo(SPListItemCollection splic)
{
List<Models.EmployeeInfo> listEmployeeInfo = new List<Models.EmployeeInfo>();
foreach (SPListItem item in splic)
{
var employeeInfo = new Models.EmployeeInfo();
if (item["EmployeeName"] == null)
{
employeeInfo.EmployeeName = "";
}
else
{
employeeInfo.EmployeeName = item["EmployeeName"].ToString();
}
if (item["Position"] == null)
{
employeeInfo.Position = "";
}
else
{
employeeInfo.Position = item["Position"].ToString();
}
if (item["Office"] == null)
{
employeeInfo.Office = "";
}
else
{
employeeInfo.Office = item["Office"].ToString();
}
if (item["IsPublic"] == null)
{
employeeInfo.IsPublic = true;
}
else
{
employeeInfo.IsPublic = Convert.ToBoolean("IsPublic");
}
listEmployeeInfo.Add(employeeInfo);
}
return listEmployeeInfo;
}
公共列表GetEmployeeInfo(SPListItemCollection splic)
{
List listEmployeeInfo=新列表();
foreach(splic中的SPListItem项)
{
var employeeInfo=新模型。employeeInfo();
如果(项目[“EmployeeName”]==null)
{
employeeInfo.EmployeeName=“”;
}
其他的
{
employeeInfo.EmployeeName=项[“EmployeeName”].ToString();
}
如果(项目[“位置”]==null)
{
employeeInfo.Position=“”;
}
其他的
{
employeeInfo.Position=item[“Position”].ToString();
}
如果(项目[“办公室”]==null)
{
employeeInfo.Office=“”;
}
其他的
{
employeeInfo.Office=item[“Office”].ToString();
}
如果(项[“IsPublic”]==null)
{
employeeInfo.IsPublic=true;
}
其他的
{
employeeInfo.IsPublic=Convert.ToBoolean(“IsPublic”);
}
listEmployeeInfo.Add(employeeInfo);
}
返回listEmployeeInfo;
}
尝试以下操作:
public List<Models.EmployeeInfo> GetEmployeeInfo(SPListItemCollection splic)
{
var listEmployeeInfo = new List<Models.EmployeeInfo>();
foreach (SPListItem item in splic)
{
var employeeInfo = new Models.EmployeeInfo();
employeeInfo.EmployeeName = item["EmployeeName"] == null ? "" : item["EmployeeName"].ToString();
employeeInfo.Position = item["Position"] == null ? "" : item["Position"].ToString();
employeeInfo.Office = item["Office"] == null ? "" : item["Office"].ToString();
employeeInfo.IsPublic = item["IsPublic"] == null || Convert.ToBoolean("IsPublic");
listEmployeeInfo.Add(employeeInfo);
}
return listEmployeeInfo;
}
公共列表GetEmployeeInfo(SPListItemCollection splic)
{
var listEmployeeInfo=新列表();
foreach(splic中的SPListItem项)
{
var employeeInfo=新模型。employeeInfo();
employeeInfo.EmployeeName=item[“EmployeeName”]=null?”:item[“EmployeeName”].ToString();
employeeInfo.Position=item[“Position”]==null?”:item[“Position”].ToString();
employeeInfo.Office=item[“Office”]==null?”:item[“Office”].ToString();
employeeInfo.IsPublic=item[“IsPublic”]==null | | Convert.ToBoolean(“IsPublic”);
listEmployeeInfo.Add(employeeInfo);
}
返回listEmployeeInfo;
}
尝试将公共逻辑重构为函数
employeeInfo.EmployeeName = ConditionalToString(item, "EmployeeName");
employeeInfo.Position = ConditionalToString(item, "Position");
employeeInfo.Office = ConditionalToString(item, "Office");
employeeInfo.IsPublic = item[attrName] == null ? false : Convert.ToBoolean("IsPublic");
string ConditionalToString(SPListItem item, string attrName)
{
return (item[attrName] == null ? "" : item[attrName].ToString());
}
由于项[attrName]和“”是不同的类型,因此类似的内容不起作用:(项[attrName]??“”).ToString()
(在这种情况下动态
会有帮助吗?我不经常使用它)
是这个逻辑发生的另一种解决方案(尽管这里仍然有相同的重复)。我同意这里给出的另一个答案,它使用三元运算符。奇怪的是,我昨天也在研究同样的事情。您可以并且应该在这里使用三元运算符,而不是if-else 优势?
- 首先,它会使代码缩短,让您一眼就能看到
- 更大的优势是。。。您当前的代码是基于语句的。因此,您所做的是测试一个条件,并作为该条件的副作用执行语句。但当使用三元运算符时,您是使用表达式来计算结果(这正是您试图做的-您试图生成要放入列表中的
对象)employeeInfo
- 在每个属性的当前设计中,有两个指定其值的位置(if块和else块)。使用三元运算符时,值仅分配在一个位置
employeeInfo
对象创建重构为另一个方法,并保持当前方法更干净(如下所示):
公共列表GetEmployeeInfo(SPListItemCollection splic)
{
var listEmployeeInfo=新列表();
foreach(SPListItem splicItem在splic中)
{
添加(CreateEmployeeInfoFromItem(splicItem));
}
返回listEmployeeInfo;
}
私有静态模型.EmployeeInfo创建EmployeeInfoFromItem(SPListItem项目)
{
var employeeInfo=新模型。employeeInfo();
employeeInfo.EmployeeName=item[“EmployeeName”]=null?”:item[“EmployeeName”].ToString();
employeeInfo.Position=item[“Position”]==null?”:item[“Position”].ToString();
employeeInfo.Office=item[“Office”]==null?”:item[“Office”].ToString();
employeeInfo.IsPublic=item[“IsPublic”]==null | | Convert.ToBoolean(“IsPublic”);
返回employeeInfo;
}
您可以使用一些反射来设置属性。 然后,您可以在所有propertynames的列表上循环并设置它们。 (这样,当属性添加到模型中时,只需将其添加到字符串列表中) 公共列表GetEmployeeInfo(SPListItemCollection splic) { var listEmployeeInfo=新列表(); var propertyNames=new List(){“EmployeeName”、“Position”、“Office”、“IsPublic”} foreach(splic中的SPListItem项) { var employeeInfo=新模型。employeeInfo(); foreach(propertyNames中的变量propertyName) { 字符串newData=“”; 如果(项[propertyName]!=null) { newData=项目[propertyName]; } employeeInfo.GetType().GetProperty(propertyName).SetValue(employeeInfo,newData,null); } listEmployeeInfo.Add(employeeInfo); } 返回listEmployeeInfo; }
我会考虑创建一个映射对象,它唯一的责任是从给定的SPLISTITEN实例创建一个雇员信息实例。在这个映射对象中,您将有您的验证标准/设置标准,然后,每当您有这个需要时,您就有了一个很好的映射对象来完成这项工作
public class SPListItemToEmployeeInfoMapper
{
public static Models.EmployeeInfo Map(SpListItem item);
{ //your logic here to create the employeeinfo from SpListItem }
}
然后你的来电者:
public List<Models.EmployeeInfo> GetEmployeeInfo(SPListItemCollection splic)
{
var listEmployeeInfo = new List<Models.EmployeeInfo>();
foreach (SPListItem splicItem in splic)
{
listEmployeeInfo.Add(SPListItemToEmployeeInfoMapper.Map(splicItem));
}
return listEmployeeInfo;
}
公共列表GetEmployeeInfo(SPListItemCollection splic)
{
var listEmployeeInfo=新列表();
foreach(SPListItem splicItem在splic中)
{
添加(SPListItemToEmployeeInfoMapper.Map(splicItem));
}
返回李
public class SPListItemToEmployeeInfoMapper
{
public static Models.EmployeeInfo Map(SpListItem item);
{ //your logic here to create the employeeinfo from SpListItem }
}
public List<Models.EmployeeInfo> GetEmployeeInfo(SPListItemCollection splic)
{
var listEmployeeInfo = new List<Models.EmployeeInfo>();
foreach (SPListItem splicItem in splic)
{
listEmployeeInfo.Add(SPListItemToEmployeeInfoMapper.Map(splicItem));
}
return listEmployeeInfo;
}