2011-03-16 23 views
23

Oldukça basit bir soru sorunum var: Enum değerleri listesinde belirli bir değerin olup olmadığını nasıl kontrol edebilirim?Değer, numara listesindedir

status in (Unverified, Active) umarım bu işe biliyorsanız

public enum UserStatus 
{ 
    Unverified, 
    Active, 
    Removed, 
    Suspended, 
    Banned 
} 

Şimdi kontrol etmek istiyorum:

Örneğin, bu enum var

bool ok = status == UserStatus.Unverified || status == UserStatus.Active; 

Ama daha şık olmalı Bunu yazmanın yolu.

this queston konusu çok benzer, ancak bayrak enumlarıyla ilgileniyor ve bu enum bayrak değil.

Şimdiden teşekkürler. o çeteleler uzun liste ise

+0

durum değişkeninin veri türü nedir? – Lav

cevap

51
İşte

şartlar bir çok çok yardımcı olur bir uzantısı yöntemidir aşağıdaki deneyebilirsiniz.

public static class Ext 
{ 
    public static bool In<T>(this T val, params T[] values) where T : struct 
    { 
     return values.Contains(val); 
    } 
} 

Kullanımı:

Console.WriteLine(1.In(2, 1, 3)); 
Console.WriteLine(1.In(2, 3)); 
Console.WriteLine(UserStatus.Active.In(UserStatus.Removed, UserStatus.Banned)); 
+0

+1 Çözümünüzü beğendim –

+0

Evet, tam da aradığım şey bu. Yine, neden bu yerleşik değil, ama en azından mümkün değildir. :) Teşekkürler! –

+0

Bu çok güzel bir yaklaşım! –

22

, şunları kullanabilirsiniz:

var allowed = new List<UserStatus> { UserStatus.Unverified, UserStatus.Active }; 
bool ok = allowed.Contains(status); 

Aksi her izin değerini işaretleyerek, uzun || yüklem etrafında bir yolu yoktur.

1

Neden onu kapsüllemek için bir yöntem oluşturmuyorsunuz?

public bool UnVerifiedOrActive(User user) 
{ 
    return (user.UserStatus == UserStatus.Unverified || 
      user.UserStatus == UserStatus.Active); 
} 
+0

Ya da statik bir sınıf içinde bir uzantı yöntemine dönüştürebilirsiniz ... –

+0

Teşekkürler, ama bu gerçekten özlü kod hakkında daha fazla bir DRY meselesi değil. C# niçin böyle durumlarda kullanılabilecek bir tür "in" operatörüne sahip olmadığından emin değilim. –

0

Sen

UserStatus ustatus; 
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus)) 
{ 
..Your logic 
} 
1
UserStatus userStatus = null; 
Eum.TryParse<UserStatus>(status.ToString(), out userStatus); 

if(userStatus != null) 
{ 
    //it is not in the list 
} 
+0

Bunun işe yaramayacağını düşünüyorum, çünkü enumdaki her değere karşı bir değer kümesini değil, doğru bir şekilde okuyorsam. –

+0

@Jerad bu çalışır. bir şans ver. "Lav" in –

+0

@Avian yayınladığıyla aynı çözüme sahibim - ancak yalnızca Doğrulanmamış veya Aktif değerler (diğer üç değere karşılık gelen) için nerede kontrol edersiniz? –

6

Kullanım Enum.IsDefined

örnek:

public enum enStage {Work, Payment, Record, Return, Reject}; 
int StageValue = 4; 

Enum.IsDefined(typeof(enStage), StageValue)