C# 将此代码转换为LINQ?

C# 将此代码转换为LINQ?,c#,.net,linq,C#,.net,Linq,对不起,我只是在学习LINQ,我对它比较陌生 是否可以将以下内容转换为LINQ foreach (DataRow gradeCount in GraceTable.Rows) { if (Convert.ToDecimal(obtMarksRow["Percentage"]) >= (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) && (Convert.ToDecimal(obt

对不起,我只是在学习LINQ,我对它比较陌生

是否可以将以下内容转换为LINQ

foreach (DataRow gradeCount in GraceTable.Rows)
{
    if (Convert.ToDecimal(obtMarksRow["Percentage"]) >= 
        (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) &&
        (Convert.ToDecimal(obtMarksRow["Percentage"]) <= 
        Convert.ToDecimal(gradeCount["EXG_MARKS_BELOW"])))
    {
        string Grade = Convert.ToString(gradeCount["EXG_GRADE_NAME"]);
    }
}
foreach(GraceTable.Rows中的DataRow gradeCount)
{
如果(将.ToDecimal(obtMarksRow[“百分比”)>=
(将.ToDecimal转换为(成绩计数[“分数高于”]))&&

(Convert.ToDecimal(obtMarksRow[“Percentage”])=marksAbove&&obtMarksRow.Field(“Percentage”)不可能。正如评论员所指出的,LINQ用于查询事物的集合。这里似乎没有集合:只有一个
if
语句和一个赋值

此外,在尝试不必要地将内容转换为LINQ时要小心。当您开始更好地理解LINQ时,您会发现自己自然地将其用于各种目的。但从假设使用LINQ代码会更好开始可能是一种谬误

编辑 如前所述,LINQ是关于查询一组结果的集合。如果只需要一个结果,可以使用
Single
First
SingleOrDefault
FirstOrDefault
将其从结果集合中取出

 var gradeValues = from DataRow gradeRow in GraceTable.Rows
                             let marksAbove = gradeRow.Field<decimal>("EXG_MARKS_ABOVE") 
                             let marksBelow = gradeRow.Field<decimal>("EXG_MARKS_BELOW")
                             where obtMarksRow.Field<decimal>("Percentage") >= marksAbove && obtMarksRow.Field<decimal>("Percentage") <= marksBelow
                             select gradeRow.Field<string>("EXG_GRADE_NAME");

var firstGradeValue = gradeValues.First(); // will throw exception if there were no matches.
Console.WriteLine(firstGradeValue);
var gradeValues=来自GraceTable.Rows中的DataRow gradeRow
让marksAbove=gradeRow.Field(“上面的EXG_标记”)
让marksBelow=gradeRow.Field(“下面的EXG_标记”)

如果obtMarksRow.Field(“Percentage”)>=marksAbove&&obtMarksRow.Field(“Percentage”)No,这是不可能的。正如评论员所指出的,LINQ用于查询事物的集合。这里似乎没有集合:只有一个
if
语句和一个赋值

此外,在尝试不必要地将内容转换为LINQ时要小心。当您开始更好地理解LINQ时,您会发现自己自然地将其用于各种目的。但从假设使用LINQ代码会更好开始可能是一种谬误

编辑 如前所述,LINQ是关于查询一组结果的集合。如果只需要一个结果,可以使用
Single
First
SingleOrDefault
FirstOrDefault
将其从结果集合中取出

 var gradeValues = from DataRow gradeRow in GraceTable.Rows
                             let marksAbove = gradeRow.Field<decimal>("EXG_MARKS_ABOVE") 
                             let marksBelow = gradeRow.Field<decimal>("EXG_MARKS_BELOW")
                             where obtMarksRow.Field<decimal>("Percentage") >= marksAbove && obtMarksRow.Field<decimal>("Percentage") <= marksBelow
                             select gradeRow.Field<string>("EXG_GRADE_NAME");

var firstGradeValue = gradeValues.First(); // will throw exception if there were no matches.
Console.WriteLine(firstGradeValue);
var gradeValues=来自GraceTable.Rows中的DataRow gradeRow
让marksAbove=gradeRow.Field(“上面的EXG_标记”)
让marksBelow=gradeRow.Field(“下面的EXG_标记”)

其中obtMarksRow.Field(“Percentage”)>=marksAbove&&obtMarksRow.Field(“Percentage”)您不应该使用Linq本身,但应该使用与Linq一起引入的DatasetExtensions,以类型安全的方式从数据行获取列,而不需要转换它们,即

if (obtMarksRow.Field<decimal>("Percentage") >= (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) && etc...
if(obtMarksRow.Field(“Percentage”)>=(Convert.ToDecimal(gradeCount[“EXG\u MARKS\u over”])等。。。

您不应该使用Linq本身,但应该使用与Linq一起引入的DatasetExtensions,以类型安全的方式从DataRow获取列,而无需转换它们,即

if (obtMarksRow.Field<decimal>("Percentage") >= (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) && etc...
if(obtMarksRow.Field(“Percentage”)>=(Convert.ToDecimal(gradeCount[“EXG\u MARKS\u over”])等。。。
尝试以下操作:

var grades = from r in GraceTables.Rows
             where obtMarksRow.Field<decimal>("Percentage") >= 
                     r.Field<decimal>("EXG_MARKS_ABOVE") && 
                   obtMarksRow.Field<decimal>("Percentage") <= 
                     r.Field<decimal>("EXG_MARKS_BELOW")
             select r.Field<string>("EXG_GRADE_NAME");
var grades=来自GraceTables.Rows中的r
其中obtMarksRow.字段(“百分比”)>=
r、 字段(“上述EXG_标记”)&
obtMarksRow.Field(“百分比”)请尝试以下操作:

var grades = from r in GraceTables.Rows
             where obtMarksRow.Field<decimal>("Percentage") >= 
                     r.Field<decimal>("EXG_MARKS_ABOVE") && 
                   obtMarksRow.Field<decimal>("Percentage") <= 
                     r.Field<decimal>("EXG_MARKS_BELOW")
             select r.Field<string>("EXG_GRADE_NAME");
var grades=来自GraceTables.Rows中的r
其中obtMarksRow.字段(“百分比”)>=
r、 字段(“上述EXG_标记”)&

obtMarksRow.Field(“百分比”)是的,这是可能的,但为什么要转换它?我在这里没有看到集合。Linq用于查询实现IEnumerable的任何集合。Linq用于查询可枚举类型。这只是一个If语句。除非这是在使用obtMarksRow迭代的循环上下文中(在这种情况下,您需要提供更多代码),这与linq无关。您应该毫无理由地将代码转换为不使用
convert
。@Nithesh Hebri:我对您的编辑写了一个响应。是的,这是可能的,但您为什么要转换它?我在这里没有看到集合。linq用于查询实现IEnumerable的任何集合。linq用于查询可枚举类型。这只是一个If语句。除非这是在使用obtMarksRow迭代的循环上下文中(在这种情况下,您需要提供更多代码),否则这与linq无关。您应该将代码转换为不使用
convert
,没有任何原因。@Nithesh Hebri:我写了一个对编辑的响应。我尝试了这个,但得到的值是“System.Linq.Enumerable+WhereSelectEnumerableTerator`2[System.Data.DataRow,System.String]”有什么问题?我尝试了这个,但得到的值是“System.Linq.Enumerable+WhereSelectEnumerableTerator`2[System.Data.DataRow,System.String]”有什么问题?