LINQ:异常为"序列不包含任何元素"

Sum*_*min 18 .net c# linq

执行以下linq时,我得到以下异常:

"序列不包含任何元素"

Linq代码:

   newGradeRow[rowCnt + 1 + "Grade " + ExamName] = 
      objDataSet.Tables[1].Rows.Cast<DataRow>()
      .Where(p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks  
         && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"]))
      .Select(p => Convert.ToString(p["EMG_GRADE_NAME"]))
      .First();
Run Code Online (Sandbox Code Playgroud)

谁可以帮我这个事?

dan*_*oid 48

First如果序列为空,则在方法调用中抛出异常,如文档中所述.在这种情况下,最好使用FirstOrDefault方法 - 它将返回默认值(在特定情况下null)并且不会抛出任何异常.


Hen*_*man 7

首先要分解它.您当前的代码没有为调试器提供任何控制.

var r1 = objDataSet.Tables[1].Rows;
var r2 = r1.Cast<DataRow>();
System.Diagnostics.Debug.Print("r2: {0}", r2.Count());
var r3 = r2.Where(p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks  
            && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"]));
System.Diagnostics.Debug.Print("r3: {0}", r3.Count());
var r4 = r3.Select(p => Convert.ToString(p["EMG_GRADE_NAME"]));
var r5 = r4.First();

newGradeRow[rowCnt + 1 + "Grade " + ExamName] = r5;
Run Code Online (Sandbox Code Playgroud)

  • 很公平,但我建议你提到它是调用`First()`抛出并解释`First()`和`FirstOrDefault()之间的区别. (3认同)

Nei*_*son 0

objDataSet.Tables[1]是空的?

也许数据在objDataSet.Tables[0]

无论哪种方式,你都可以测试objDataSet.Tables.Count() > 0

您可以对行执行相同的操作:objDataSet.Tables[1].Rows.Count() > 0

  • 或者没有元素通过“Where”过滤器。当给定一个空列表时,“First”会引发异常。 (2认同)