Jika semua item dalam daftar memiliki nilai yang sama, maka saya perlu menggunakan nilai itu, jika tidak, saya perlu menggunakan "otherValue". Saya tidak dapat memikirkan cara yang sederhana dan jelas untuk melakukan ini.
Lihat juga Neat way to write loop yang memiliki logika khusus untuk item pertama dalam sebuah koleksi.
Jawaban:
Cara terbersih yang bisa saya pikirkan. Anda dapat membuatnya menjadi satu baris dengan memasukkan val, tetapi First () akan dievaluasi sebanyak n kali, menggandakan waktu eksekusi.
Untuk memasukkan perilaku "set kosong" yang ditentukan dalam komentar, Anda cukup menambahkan satu baris lagi sebelum dua baris di atas:
sumber
.Any
memungkinkan pencacahan untuk berhenti lebih awal dalam kasus di mana ada nilai yang berbeda?All
akan berhenti segera setelah menyentuh elemenx
dari urutannyax.Value != val
. Demikian pula,Any(x => x.Value != val)
akan berhenti segera setelah menyentuh elemenx
dari urutan yang untuknyax.Value != val
. Artinya, baikAll
danAny
pameran "hubungan arus pendek" analog dengan&&
dan||
(yang efektif apaAll
danAny
yang).return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;
Tes cepat yang bagus untuk semua yang setara:
sumber
Class
, meskipun harus bekerja dengan struct. Bagus untuk daftar primitif.collection.Distinct().Count() <= 1
jika Anda ingin mengizinkan koleksi kosong..Distinct()
tidak selalu bekerja seperti yang diharapkan - terutama ketika Anda bekerja dengan objek, lihat pertanyaan ini . Dalam kasus tersebut, Anda perlu mengimplementasikan antarmuka IEquatable.Distinct
tidak akan melintasi koleksi sama sekali, danCount
akan melakukan satu perjalanan melaluiDistinct
iterator.Meskipun Anda pasti dapat membuat perangkat seperti itu dari operator urutan yang ada, saya dalam hal ini cenderung menulis yang ini sebagai operator urutan khusus. Sesuatu seperti:
Itu cukup jelas, singkat, mencakup semua kasus, dan tidak perlu membuat iterasi tambahan dari urutan tersebut.
Menjadikan ini menjadi metode umum yang berhasil
IEnumerable<T>
dibiarkan sebagai latihan. :-)sumber
other
saatnull
sebenarnya (mungkin) respons yang benar. Katakanlah fungsi ituT Unanimous<U, T>(this IEnumerable<U> sequence, T other)
atau tanda tangan semacam itu, yang sedikit memperumitnya.Atau jika Anda khawatir tentang mengeksekusi First () untuk setiap elemen (yang bisa menjadi masalah kinerja yang valid):
sumber
Ini mungkin terlambat, tetapi ekstensi yang berfungsi untuk jenis nilai dan referensi sama berdasarkan jawaban Eric:
sumber
sumber
Alternatif untuk menggunakan LINQ:
Saya telah menemukan penggunaan
HashSet<T>
lebih cepat untuk daftar hingga ~ 6.000 bilangan bulat dibandingkan dengan:sumber
HashSet<T>
awalnya lebih cepat daripada menggunakan pernyataan LINQ dalam jawaban saya. Namun, jika saya melakukan ini dalam satu lingkaran, maka LINQ lebih cepat.GetHashCode()
, yang sulit dilakukan dengan benar. Lihat: stackoverflow.com/a/371348/2607840 untuk lebih jelasnya.Sedikit variasi dari pendekatan sederhana di atas.
var result = yyy.Distinct().Count() == yyy.Count();
sumber
Jika sebuah array berjenis multidimensi seperti di bawah ini maka kita harus menulis di bawah linq untuk memeriksa datanya.
contoh: di sini elemen adalah 0 dan saya memeriksa semua nilai adalah 0 atau tidak.
ip1 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
sumber