2010-09-28 2 views
1

Я использую побитовое перечисление как источник данных для управления ретранслятором, в котором каждая строка имеет флажок. Когда пользователь сохраняет данные, значения перечисления, соответствующие отмеченным ячейкам, сохраняются в одном поле базы данных.Итерировать через сохраненные значения Побитовое перечисление

Однако, когда пользователь приходит к редактированию данных, очевидно, мне нужно предварительно заполнить ретранслятор существующими значениями. Я могу сделать это в прямом значении, перейдя через возможные значения перечислимого и проверочного ящиков соответственно. Однако в идеале мне бы очень хотелось, чтобы мой код оставался независимым от изменений в данных: поэтому, если я изменил или добавлю значения в Enum, мой код по-прежнему будет работать без изменения кода в моем элементе управления.

Кажется очевидным, что нужно попытаться выполнить итерацию существующих значений в поле перечисления, как только я вернусь из базы данных. Другими словами, если сохраненное значение соответствует двум выборам из нескольких в перечислении, мне нужно пройти через эти два. Однако я не вижу никакого метода или свойства, которые я могу использовать для этого. Может кто-то указать мне верное направление?

Образец ... который может помочь понять это ... заключается в том, что я могу получить какой-то эффект, который я хочу, отбросив его на строку и разбивая ее, но это неуклюжие (comsPrefs - это перечисление)

 Dim selectedPrefs As String = comsPrefs.ToString() 
     Dim splitStr() As String = selectedPrefs.Split(","c) 
     Dim i As Integer 

     For i = 0 To splitStr.Length - 1 
      'do some cool stuff 
     Next 
+0

Возможно, образец кода может прояснить, что вы пытаетесь сделать? –

ответ

2

Что-то вроде этого?

[Flags] 
public enum YourEnum 
{ 
    One = 1, Two = 2, Four = 4, Eight = 8 
} 

// ... 

YourEnum exampleData = YourEnum.Two | YourEnum.Four; 

var values = Enum.GetValues(typeof(YourEnum)) 
       .Cast<YourEnum>() 
       .Where(x => exampleData.HasFlag(x)); 

foreach (var v in values) 
{ 
    Console.WriteLine(v); 
} 

Обратите внимание, что метод HasFlag доступен только в .NET 4 - если вы используете более раннюю версию инфраструктуры, то вы должны будете использовать Where(x => (exampleData & x) == x) вместо этого.

+0

приятно, спасибо. Я все еще недостаточно знаком с linq/lambda, чтобы думать об этом как о решении! –

0

Чтобы получить все значения перечисления, используйте Enum.GetValues(typeof(myEnumeration)).

System.Enum имеет другие методы, которые позволят вам получить идентификаторы (имена) и преобразовать имена в/из значений.

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

+0

Спасибо, но мне не нужны все возможные значения. Мне просто нужны сохраненные значения. Итак, представьте себе, что в моем перечислении используются яблоки = 1, апельсины = 2, груши = 4, а значение, сохраненное для определенной строки, равно 3 (яблоки или апельсины). Мне нужно итерировать потенциальные значения того, что было спасено, т.е. яблоки, апельсины , Имеет ли это смысл? –