2011-04-29 12 views
8

yield returnをループで使用する関数からIEnumerable<object[]>要素を返します。IEnumerableアイテムの最初の要素を取得する

public static IEnumerable<object[]> GetData() 
{ 
     ... 

     connection.Open(); 

     using (OleDbDataReader dr = command.ExecuteReader()) 
     { 
      while (dr.Read()) 
      { 
      object[] array = new object[dr.FieldCount]; 
       dr.GetValues(array); 
      yield return array; 
      } 
     } 

     connection.Close(); 
} 

ループを使用しないで最初の要素を取得するには、どのような方法が最適ですか?要するに

var result = Adapter.GetData(); 

答えて

14

enumerator=result.GetEnumerator(); 
enumerator.MoveNext(); 
enumerator.Current; 

これは、foreachのは、すべての要素を反復処理するループの中で何をするかです。

適切な方法:LINQと

using (IEnumerator<object[]> enumerator = result.GetEnumerator()) { 
    if (enumerator.MoveNext()) e = enumerator.Current; 

}

:また

var e = result.First(); 

又は

var e = result.FirstOrDefault(default); 

var e = result.ElementAt(0); 
+0

場合。しかし、別の問題に遭遇してしまい、 'yield returns'の後にDB接続を閉じるので、関数を2回呼び出すと、前の接続が閉じていないという例外が発生します。どうしてforeachでうまくいくのでしょうか?何とか何かを処分すべきですか? –

+0

最初の要素を取得するために使ったことは何ですか? – manojlds

+0

クールマン、 'CloseConnection'ビヘイビアを' ExecuteReader'関数に渡して修正しました。すべてがうまくいっています。ありがとう。 –

0

result.First()を使用できませんか?

+0

いいえ、最初の方法はありません。 –

+0

@DavidWeng:待って、IEnumerableは 'First()'メソッドを持っていませんか?それとも、私はあなたの質問を完全に誤解していますか? – alex

+0

リファレンスがありませんか? 'System.Collections.Generic.IEnumerable 'に 'First'の定義が含まれておらず、 'System.Collections.Generic.IEnumerable '型の最初の引数を受け入れる拡張メソッド 'First'が見つかりませんでしたusingディレクティブまたはアセンブリ参照?) –

1

これは、おかげでいいです、あなたの.NET 3.5以上

Adapter.GetData().First() 
0
enumerator=result.GetEnumerator(); 
enumerator.MoveNext(); 
enumerator.Current; 
+8

最高の投票回答は実際には全く同じ回答です。見逃すのは難しい。 – alex

0
public static T FirstOrDefault<T>(this IEnumerable items) where T : class { 
     var list = items.OfType<T>(); 
     if (list!= null) { 
      return list.FirstOrDefault(); 
     } 

     return default(T); 
    } 
関連する問題