将此代码转换为LINQ
本文关键字:LINQ 转换 代码 | 更新日期: 2023-09-27 18:06:43
对不起,我刚刚学习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"]);
}
}
编辑:抱歉,我错过了ma查询中的每个循环,obtMarksRow来自于这个
之外的另一个循环我写了这样的查询
var gradeValue = 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");
但我得到的值(gradeValue.ToString())为"System.Linq.Enumerable+WhereSelectEnumerableIterator ' 2[System.Data.DataRow,System.String]"
不,不可能。正如评论者指出的那样,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 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");
你不应该使用Linq本身,但你应该使用与Linq一起带来的DatasetExtensions,以类型安全的方式从DataRow获取列,而不需要转换它们,即
if (obtMarksRow.Field<decimal>("Percentage") >= (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) && etc...