2011-04-29 153 views
8

我正在返回一個IEnumerable<object[]>元素,該函數在循環中使用yield return獲取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確實在遍歷所有的元素進行迭代。

有道:

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

}

隨着LINQ:

var e = result.First(); 

var e = result.FirstOrDefault(default); 

另外:

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

這是很好的,謝謝。但它讓我碰到另一個問題,那就是我在'yield return'後關閉了數據庫連接,所以如果我調用這個函數兩次,它會引發一個異常,說上一個連接沒有關閉。如何用'foreach'正常工作?我應該以某種方式處理某些事情嗎? – 2011-04-29 05:57:52

+0

你能說出你用來獲得第一個元素嗎? – manojlds 2011-04-29 06:02:14

+0

酷男,我通過將'CloseConnection'行爲傳遞給'ExecuteReader'函數來解決它。現在一切都很好。感謝堆。 – 2011-04-29 06:04:16

0

難道你不能使用result.First()

+0

不,沒有第一種方法。 – 2011-04-29 05:24:21

+0

@DavidWeng:等待,不是IEnumerable有一個First()方法嗎?或者我完全誤解了你的問題(可能)? – alex 2011-04-29 05:25:37

+0

我是否缺少參考? 'System.Collections.Generic.IEnumerable '沒有包含'First'的定義,也沒有找到擴展方法'First'接受類型爲'System.Collections.Generic.IEnumerable '的第一個參數一個使用指令或程序集引用?) – 2011-04-29 05:49:19

1

如果您的.NET 3.5或更高

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

最高投票響應實際上具有完全相同的答案。這很難錯過。 – alex 2011-04-29 05:31:07

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); 
    } 
相關問題