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()
  • コレクションに常に1つ以上のアイテムがある場合は、を使用しますFirst()
  • コレクションに常に0または1つのアイテムがある場合は、を使用しますSingleOrDefault()
  • コレクションに常に1つのアイテムがある場合は、を使用します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を確認してください。

編集:個々の結果を得るためにどの方法をいつ使用するかを説明しているエリックの答えを必ず読んでください。

于 2013-03-21T04:42:46.850 に答える
2

結果はコレクションタイプです。Datatable.AsEnumerableを反復処理する必要があります。結果がLINQがコレクションで返すタイプIEneumerable<T>やその他の場合は、次のように繰り返す必要があります

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