Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 使用几个if-else语句重构foreach循环_C# - Fatal编程技术网

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