Katakanlah saya punya enum ini:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
Untuk memeriksa apakah misalnya AB
diatur saya bisa melakukan ini:
if((letter & Letters.AB) == Letters.AB)
Apakah ada cara yang lebih sederhana untuk memeriksa apakah ada flag dari gabungan flag konstan yang ditetapkan daripada yang berikut?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
Bisakah Anda misalnya menukar &
dengan sesuatu?
Tidak terlalu stabil dalam hal biner seperti ini ...
Jawaban:
Jika Anda ingin tahu apakah huruf memiliki salah satu huruf di AB, Anda harus menggunakan DAN & operator. Sesuatu seperti:
sumber
letter & Letters.AB
. Diedit di sana.Letters.None
, saya berasumsi Anda bisa menukar itu dengan tampilan0
yang kurang bisa dibandingkan dengan angka ajaib?Di .NET 4 Anda dapat menggunakan metode Enum.HasFlag :
Contoh ini menampilkan output berikut:
sumber
petsInFamily
memilikiPet.Dog || Pet.Cat
?Saya menggunakan metode ekstensi untuk menulis hal-hal seperti itu:
Berikut kodenya:
sumber
where T : struct, IConvertible
. Kode yang bagus!IsFlagSet(this Enum value, Enum flag)
Cukup.Ada metode HasFlag di .NET 4 atau lebih tinggi.
sumber
Jika Anda dapat menggunakan .NET 4 atau lebih tinggi daripada menggunakan metode HasFlag ()
contoh
sama dengan
sumber
bitwise OR
membuatnya "keduanya harus diatur" dan bukan?bitwise OR
akan menggabungkan nilai, jadi 1000 | 0010 menjadi 1010, atau keduanya disetelJika itu benar-benar mengganggu Anda, Anda dapat menulis fungsi seperti itu:
sumber
return (value & flag) == flag;
tidak mengkompilasi: "Operator '&' tidak dapat diterapkan ke operan tipe 'T' dan 'T'" .Ini cek yang kedua A dan B ditetapkan, dan pengabaian apakah ada bendera lain yang ditetapkan.
Ini memeriksa apakah A atau B diatur, dan mengabaikan apakah ada flag lain yang diatur atau tidak.
Ini dapat disederhanakan untuk:
Inilah C untuk operasi biner; harus langsung menerapkan ini ke C #:
Secara kebetulan, penamaan variabel dalam contoh pertanyaan adalah 'huruf' tunggal, yang mungkin menyiratkan bahwa itu hanya mewakili satu huruf; kode contoh memperjelas bahwa set huruf yang mungkin dan beberapa nilai diperbolehkan, jadi pertimbangkan untuk mengganti nama variabel 'huruf'.
sumber
anything_and_a
,a_and_or_c_and_anything_else
danboth_ac_and_anything_else
selalu benar? atau saya kehilangan sesuatu di sini?Bagaimana tentang
?
sumber
Saya membuat metode ekstensi sederhana yang tidak perlu dicentang
Enum
jenisnya:Ini juga berfungsi pada enum yang dapat dibatalkan.
HasFlag
Metode standar tidak, jadi saya membuat ekstensi untuk membahasnya juga.Tes sederhana:
Nikmati!
sumber
Ada banyak jawaban di sini tapi saya pikir cara paling idiomatis untuk melakukan ini dengan Flags adalah Letters.AB.HasFlag (letter) atau (Letters.A | Letters.B) .HasFlag (letter) jika Anda tidak sudah memiliki Letters.AB. letter.HasFlag (Letters.AB) hanya berfungsi jika memiliki keduanya.
sumber
Apakah ini akan berhasil untuk Anda?
Salam,
Sebastiaan
sumber
Anda dapat menggunakan metode ekstensi ini pada enum, untuk semua jenis enum:
sumber
sumber
Anda bisa memeriksa apakah nilainya tidak nol.
Tetapi saya akan menganggapnya sebagai solusi yang lebih baik untuk memperkenalkan nilai enumerasi baru dengan nilai nol dan membandingkannya dengan nilai enumerasi ini (jika mungkin karena Anda harus dapat memodifikasi enumerasi).
MEMPERBARUI
Salah membaca pertanyaan - perbaiki saran pertama dan abaikan saja saran kedua.
sumber
Ada dua pendekatan yang dapat saya lihat yang akan berfungsi untuk memeriksa bit yang diset.
Aproach A
Ini berfungsi selama Anda tidak keberatan memeriksa semuanya bit, termasuk yang tidak didefinisikan juga!
Aproach B
Ini hanya memeriksa bit yang ditentukan, selama Letters. Semua mewakili semua bit yang mungkin.
Untuk bit tertentu (satu set atau lebih), gunakan Aproach B mengganti Letters. Semua dengan bit yang ingin Anda periksa (lihat di bawah).
sumber
Maaf, tetapi saya akan menunjukkannya di VB :)
CntValue = 5 Jadi enum berisi 1 + 4
sumber