0
dt = ds.Tables[1];

foreach (EPSFromElement element in elementList)
{
    foreach (DataRow row in dt.Rows)
    {
        foreach (DataColumn column in dt.Columns)
            {
                var ColumnName = column.ColumnName;
                var ColumnData = row[column].ToString();
                var currentElement = Regex.Replace(element.Field_Label, @"\W", "");

                if (element.Module_Field_ID != null)
                {

                    if (currentElement == ColumnName)
                        element.ColumnValue = ColumnData;                                
                }
                else
                {
                    if (element.Field_Type_Name != "Checkbox")
                    {
                        if ("Q_" + element.Column_Name_ID == ColumnName)
                            element.ColumnValue = ColumnData;
                    }
                    else
                    {
                        if ("Q_" + element.Column_Name_ID + "_" + element.Value_Column_Name_ID == ColumnName)
                                    element.ColumnValue = ColumnData; 
                     }
                 }
        }
    }
}

我有一个对象列表(EPSElement)。在 EPSElement 中有一个字段 ColumnValue 从数据表中获取数据 (dt = ds.Tables[1];)。为了实现这一点,我正在使用 foreach 循环。有没有更好的方法来做到这一点。我对每个循环三个都不太满意。可以用 LINQ 代替吗?

4

2 回答 2

5

永远不会尝试用 LINQ 替换它。首先,您在内部发生变异,而尝试使用 LINQforeach是一个坏主意。LINQ 是关于查询的(LIN Q中的“ Q ”用于查询),因此不应该有副作用。但是,即使假设您要使用对新对象序列的投影来替换突变,将其转换为 LINQ 也很难阅读;太多的嵌套逻辑。不要管它。

于 2013-08-12T15:51:15.690 回答
2

这翻译得相当好。每个foreach-es 都翻译成它们自己from的 s,少数变量都是lets,所有的ifs 最终都是where's。

var query = from element in elementList
            from row in dt.Rows.Cast<DataRow>()
            from column in dt.Columns.Cast<DataColumn>()
            let ColumnName = column.ColumnName
            let ColumnData = row[column].ToString()
            let currentElement = Regex.Replace(element.Field_Label, @"\W", "")
            where (element.Module_Field_ID != null && currentElement == ColumnName)
            || (element.Field_Type_Name != "Checkbox" 
                    && "Q_" + element.Column_Name_ID == ColumnName
                || element.Field_Type_Name == "Checkbox"
                    && "Q_" + element.Column_Name_ID + "_" + element.Value_Column_Name_ID == ColumnName)
            select new { Element = element, ColumnData = ColumnData };

foreach (var item in query)
    item.Element.ColumnValue = item.ColumnData;

请注意,由于 中的逻辑Where有点复杂,最好将其重构为自己的方法,其中您有类似的东西:

where IsValid(element, ColumnName, currentElement)

然后,实现可以是我的查询或您的原始代码中的逻辑,根据您的喜好。

于 2013-08-12T16:16:46.690 回答