我在VB中有这段代码:
Private mTemmpEmpTimesheetDeclareDetails As IEnumerable(Of
EmpTimesheetDeclareDetail) = Nothing
If mTemmpEmpTimesheetDeclareDetails.Count > 0 Then
mEmpTimesheetDeclareDetail = mTemmpEmpTimesheetDeclareDetails(0)
End If
现在我已经在 c# 中转换了相同的代码段:
private IEnumerable<EmpTimesheetDeclareDetail> mTemmpEmpTimesheetDeclareDetails = null;
if (mTemmpEmpTimesheetDeclareDetails.Count() > 0)
{
mEmpTimesheetDeclareDetail = (EmpTimesheetDeclareDetail)mTemmpEmpTimesheetDeclareDetails(0);
}
它在这里给了我错误(EmpTimesheetDeclareDetail)mTemmpEmpTimesheetDeclareDetails(0)
不可调用的成员不能像方法一样使用。虽然我知道我使用mTemmpEmpTimesheetDeclareDetails
作为不正确的方法的错误。但是它如何在 VB 中接受它呢?如何在 C# 中实现这一点?
您已将您的成员声明为IEnumerable<T>
。IEnumerable<T>
不支持索引,因为它是一系列值。你正在寻找ElementAt()
.因此,您的代码将变为:
mEmpTimesheetDeclareDetail = mTemmpEmpTimesheetDeclareDetails.ElementAt(0);
请注意,您不需要强制转换结果,因为 ElementOf()
的结果将与 T
相同(在这种情况下,由于您是 IEnumerable<EmpTimesheetDeclareDetail>
,结果将是 EmpTimesheetDeclareDetail
)。
此外,您还可以整理其他一些事项:
使用.Any()
而不是Count() > 0
。根据序列的来源,这可以阻止整个序列被具体化,它只会具体化第一项以检查序列是否不为空。
此外,还存在比ElementAt(0)
更清晰的First
和FirstOrDefault()
。如果没有元素,前者将引发异常,后者将在您的情况下返回null
。但是,由于您已经检查了元素,因此First()
更适合这里。
mTemmpEmpTimesheetDeclareDetails(0)
应该mTemmpEmpTimesheetDeclareDetails.ElementAt(0)
在c#
索引应该通过一对方括号访问 []
. 这里括号用于调用方法。因此,当您使用 mTemmpEmpTimesheetDeclareDetails(0)
时,编译器假定您正在使用整数参数调用名为 mTemmpEmpTimesheetDeclareDetails
的方法。
但是在您的情况下,您正在基于其索引访问IEnumerable<T>
,因此您必须使用方法.ElementAt(index)
,因为Enumerable更通用,并且由enumerable表示的集合可能没有索引器