1

我有以下代码:

private void SelectRowData(int wire, int bond, string svid)
{
    var results = from myRow in PPLoadedData.AsEnumerable()
                  where 
                      myRow.Field<Int32>("Wires.OperationOrder") == wire &&
                      myRow.Field<Int32>("Bonds.OperationOrder") == bond
                  select myRow[svid];
}

我可以看到当我调试结果确实有我预期的单个字符串项。但是,我无法以我知道的任何方式索引或迭代数据。

我正在寻找的是可以访问数据的东西。

这是调试器所说的:

名称:(新 System.Linq.SystemCore_EnumerableDebugView(results)).Items[0]

价值:700.0

类型:对象 {double}

PPLoadedData是一个DataTable

提前致谢。

4

3 回答 3

13

为了澄清杰森的回答:

  • 如果集合可以包含任意数量的项目,请使用FirstOrDefault().
  • 如果集合总是有一个或多个项目,请使用First().
  • 如果集合总是有零个或一个项目,请使用SingleOrDefault().
  • 如果集合始终只有一项,请使用Single().

如果您使用适当的方法,那么当您的不变量被违反时,您会得到一个异常,这将有助于您调试程序。

于 2013-03-21T06:22:03.983 回答
7

如果您希望查询产生单个项目,则应使用如下SingleOrDefault方法:

var result = (from myRow in PPLoadedData.AsEnumerable()
               where myRow.Field<Int32>("Wires.OperationOrder") == wire && 
                     myRow.Field<Int32>("Bonds.OperationOrder") == bond
               select myRow[svid]).SingleOrDefault();
if(result != null)
    // Do stuff with result

通常,Linq 查询返回 IEnumerables,您必须对其进行迭代,而不是按索引访问。但是,在您只想要一个值的情况下,有几种方法可以获取您想要的值。查看MSDN 上的System.Linq.Enumerable了解更多信息。

编辑:请务必阅读 Eric 的答案,其中解释了何时使用哪种方法来获得单个结果。

于 2013-03-21T04:42:46.850 回答
2

结果是集合类型。您需要对其进行迭代Datatable.AsEnumerable。当结果是IEneumerable<T>LINQ 在 collection 中返回的类型和其他类型时,您需要像这样迭代

foreach (var item in results)
{
  //do some thing with item 
}
于 2013-03-21T04:42:13.300 回答