将 foreach 替换为 linq
本文关键字:linq 替换 foreach | 更新日期: 2023-09-27 18:27:32
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。表格[1];).为了实现这一点,我正在使用那里的 foreach 循环。有没有更好的方法可以做到这一点。我对每个循环三个不太满意。这可以用 LINQ 替换吗?
我永远不会尝试用 LINQ 替换它。首先,您在foreach
体内发生变异,尝试使用 LINQ 进行此操作是一个坏主意。LINQ 是关于查询的(LIN Q 中的">Q"代表 q uery(,因此不应该有副作用。但是,即使假设您要将突变替换为对新对象序列的投影,将其转换为 LINQ 也很难阅读;嵌套逻辑太多。别管它。
这翻译得相当好。 每个foreach
-es 都转换为它们自己的from
,几个变量都是 let
s,所有if
最终都是 where
的。
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)
然后,实现可以是我的查询或原始代码中的逻辑,基于你喜欢的逻辑。