2013-10-06 2 views
-1

У меня есть FaultTypeenum с более чем 100 членами.Список населенных пунктов <enum> на основе констант?

public enum FaultType 
{ 
    FaultType1, 
    FaultType2, 
    FaultType3, 
    FaultType4, 
    FaultType5, 
} 

И у меня есть FaultTypeConstantsclass, соответствующий FaultType.

public class FaultTypeConstants 
{ 
    public const int FaultType1 = 600; 
    public const int FaultType2 = 100; 
    public const int FaultType3 = 453; 
    public const int FaultType4 = 200; 
    public const int FaultType5 = 300; 
} 

Я пытался ..

public static List<FaultType> GetFaults(List<int> FaultConstants) 
    { 
     var faults = new List<FaultType>(); 
     FaultConstants.ForEach(fc => { 
      switch (fc) 
      { 
       case FaultTypeConstants.FaultType1: 
        faults.Add(FaultType.FaultType1); 
        break; 
       case FaultTypeConstants.FaultType2: 
        faults.Add(FaultType.FaultType2); 
        break; 
       case FaultTypeConstants.FaultType3: 
        faults.Add(FaultType.FaultType3); 
        break; 
       case FaultTypeConstants.FaultType4: 
        faults.Add(FaultType.FaultType4); 
        break; 
       case FaultTypeConstants.FaultType5: 
        faults.Add(FaultType.FaultType5); 
        break; 
       default: 
        break; 
      } 
     }); 

     return faults; 
    } 

Теперь, как я могу заселить List<FaultType> на основе FaultTypeConstants значений?

ответ

5

Просто укажите константу, как часть самого перечислимого :

public enum FaultType 
{ 
    FaultType1 = 600, 
    FaultType2 = 100, 
    FaultType3 = 453, 
    FaultType4 = 200, 
    FaultType5 = 300, 
} 

Тогда вы можете просто бросить:

FaultType ft = (FaultType) 600; 

Для списка, вы можете перебирать в foreach петлю, или если вы, как LINQ вы можете можете просто использовать:

List<FaultType> listOfFaultTypes = listOfInts.Cast<FaultType>().ToList(); 

UPDATE

На основе ваших комментариев, что вы вообще не можете изменить перечисление, я предлагаю вам создать словарь, который вы можете использовать для поиска.

private static readonly Dictionary<int, FaultType> FaultTypeDictionary = 
    Enum.GetValues(typeof(FaultType)) 
     .Cast<FaultType>() 
     .ToDictionary(
      x => (int)typeof(FaultTypeConstants).GetField(x.ToString()).GetValue(null), 
      x => x); 

public static List<FaultType> GetFaults(List<int> faults) 
{ 
    return faults.Select(x => FaultTypeDictionary[x]).ToList(); 
} 

Он использует отражение, но делает только один проход против перечисления. Поскольку это статично, у вас не будет затрат на выполнение этого для каждого поиска.

+0

Согласен. Но это не мое требование. См. Мой ответ ниже. –

+0

Какая часть этого не будет соответствовать вашим требованиям? Вам не разрешено изменять перечисление? –

+1

Да. Я не позволю назначить значение для FaultType. Именно по этой причине я поддерживал отдельный класс для этого. Хотя это плохой дизайн, но это мое требование к проекту. –

1

Попробуйте Enum.GetValues

Enum.GetValues(typeof(FaultType)).Cast<FaultType>().ToList() 

EDIT

на основе функции подписи в OP, есть Eleaner стороннюю

public static List<FaultType> GetFaults(List<int> FaultConstants) 
{ 
    return FaultConstants.Cast<FaultType>().ToList() 
} 
+0

Сначала вы получите все FaultType в списке, но на основе вопроса, полученного лучше, я обновил свой ответ. См. Отредактированную часть. – Tilak

+0

Это не сработает, если значение enum не соответствует, и тогда вы в основном делаете то же самое, что я написал. –

+0

@Прапад, я не путник, это неправильное предположение. – Tilak

-1

У меня есть решение.

public static List<FaultType> GetFaults(List<int> FaultConstants) 
{ 
    return typeof(FaultTypeConstants) 
     .GetFields(BindingFlags.Public | BindingFlags.Static) 
     .Where(fi => FaultConstants.Contains(Convert.ToInt32(fi.GetValue(null)))) 
     .Select(fi => (FaultType)Enum.Parse(typeof(FaultType), fi.Name)).ToList(); 
    } 
+0

@Downvoter, позаботьтесь о комментариях? –

+0

Существует более чистый способ, см. Мою отредактированную часть. – Tilak

+0

Отражение на большом списке будет очень медленным. Существует лучший способ. В ближайшее время у меня будет обновленный ответ ... –

Смежные вопросы