【问题标题】:Convert this code to LINQ?将此代码转换为 LINQ?
【发布时间】:2011-08-25 14:25:48
【问题描述】:

抱歉,我刚刚学习 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 用于查询任何实现 IEnumerable 的集合。
  • LINQ 用于查询可枚举类型。这只是一个 If 语句。除非这是在使用 obtMarksRow 迭代的循环的上下文中(在这种情况下您需要提供更多代码),否则这与 linq 无关。
  • 您应该将您的代码转换为无缘无故不使用Convert
  • @Nithesh Hebri:我为您的编辑写了回复。

标签: c# .net linq


【解决方案1】:

不,这是不可能的。正如评论者所指出的,LINQ 用于查询事物的集合。您在这里似乎没有集合:只有一个 if 语句和一个赋值。

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

编辑

如前所述,LINQ 是关于查询集合以获取一组结果。如果您只想要一个结果,可以使用SingleFirstSingleOrDefaultFirstOrDefault 将其从结果集合中取出。

 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);

【讨论】:

    【解决方案2】:

    尝试以下方法:

    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");
    

    【讨论】:

    • 我试过这个,但我得到的值是“System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Data.DataRow,System.String]”有什么问题?
    【解决方案3】:

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

    if (obtMarksRow.Field<decimal>("Percentage") >= (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) && etc...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      相关资源
      最近更新 更多