Jika Anda dapat menggunakan LINQ Anda dapat menggunakan:
var e = enumerable.First();
Ini akan menghasilkan pengecualian meskipun jika enumerable kosong: dalam hal ini Anda dapat menggunakan:
var e = enumerable.FirstOrDefault();
FirstOrDefault()
akan kembali default(T)
jika enumerable kosong, yang akan null
untuk tipe referensi atau 'nilai nol' default untuk tipe nilai.
Jika Anda tidak dapat menggunakan LINQ, maka pendekatan Anda secara teknis benar dan tidak berbeda dengan membuat enumerator menggunakan metode GetEnumerator
dan MoveNext
untuk mengambil hasil pertama (contoh ini menganggap enumerable adalah:) IEnumerable<Elem>
:
Elem e = myDefault;
using (IEnumerator<Elem> enumer = enumerable.GetEnumerator()) {
if (enumer.MoveNext()) e = enumer.Current;
}
Joel Coehoorn disebutkan .Single()
dalam komentar; ini juga akan berfungsi, jika Anda mengharapkan enumerable Anda mengandung tepat satu elemen - namun itu akan menimbulkan pengecualian jika elemen tersebut kosong atau lebih besar dari satu elemen. Ada SingleOrDefault()
metode yang sesuai yang mencakup skenario ini dengan cara yang mirip dengan FirstOrDefault()
. Namun, David B menjelaskan bahwa SingleOrDefault()
mungkin masih ada pengecualian dalam kasus di mana enumerable berisi lebih dari satu item.
Sunting: Terima kasih Marc Gravell untuk menunjukkan bahwa saya harus membuang IEnumerator
objek saya setelah menggunakannya - Saya telah mengedit contoh non-LINQ untuk menampilkan using
kata kunci untuk menerapkan pola ini.
Hanya dalam kasus Anda menggunakan .NET 2.0 dan tidak memiliki akses ke LINQ:
Ini harus melakukan apa yang Anda cari ... menggunakan generik sehingga Anda mendapatkan item pertama pada semua jenis IEnumerable.
Sebut seperti ini:
Atau
Anda dapat memodifikasinya dengan mudah untuk meniru IEnumerable.ElementAt () metode ekstensi .NET 3.5:
Menyebutnya seperti ini:
Tentu saja jika Anda lakukan memiliki akses ke LINQ, maka ada banyak jawaban yang baik diposting sudah ...
sumber
Yah, Anda tidak menentukan versi .Net yang Anda gunakan.
Dengan asumsi Anda memiliki 3,5, cara lain adalah metode ElementAt:
sumber
FirstOrDefault ?
sumber
coba ini
sumber
Gunakan FirstOrDefault atau loop foreach seperti yang telah disebutkan. Pengambilan enumerator secara manual dan memanggil Arus harus dihindari. foreach akan membuang enumerator Anda untuk Anda jika mengimplementasikan IDisposable. Saat memanggil MoveNext dan Lancar Anda harus membuangnya secara manual (jika dapat diterapkan).
sumber
Jika IEnumerable Anda tidak mengeksposnya
<T>
dan Linq gagal, Anda dapat menulis metode menggunakan refleksi:sumber
Anda juga dapat mencoba versi yang lebih umum yang memberi Anda elemen engan
enumerable.ElementAtOrDefault (i));
semoga membantu
sumber