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 ループを使用しています。これを行うためのより良い方法はありますか。ループごとに 3 つではあまり満足できません。これを LINQ に置き換えることはできますか。

4

2 に答える 2

5

それをLINQに置き換えようとは決してしません。まず、 の本体内で変更を行っていますが、これをLINQforeachで行うのはお勧めできません。LINQ はクエリに関するものであり (LIN Qの「 Q 」はクエリを意味します)、副作用はありません。しかし、ミューテーションをオブジェクトの新しいシーケンスへの射影に置き換えたとしても、それを LINQ に変換すると非常に読みにくくなります。ネストされたロジックが多すぎます。ほっといて。

于 2013-08-12T15:51:15.690 に答える
2

これはかなりうまく翻訳されます。-esはそれぞれforeach独自の に変換されfrom、いくつかの変数はそれぞれletであり、すべての は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)

実装は、好みに基づいて、クエリまたは元のコードのいずれかのロジックにすることができます。

于 2013-08-12T16:16:46.690 に答える