Использование Linq для преобразования значений элементов ListBox в int - PullRequest
2 голосов
/ 13 мая 2009

Я отображаю содержимое таблицы в базе данных, используя ListBox. Каждый элемент списка заполняется свойством Text, для которого установлено понятное имя, а свойством Value - уникальный столбец идентификатора. Структура базы данных может выглядеть примерно так:

CREATE TABLE GENERIC { FRIENDLY_NAME TEXT, ID INT }

Я почти час пытался преобразовать элементы списка в int [], используя LINQ, и в итоге потерпел неудачу. Также важно различать выбранные и не выбранные элементы. Вот что я написал:

System.Collections.Generic.LinkedList<int> 
            selected = new LinkedList<int>(), 
            notSelected = new LinkedList<int>();

        foreach (ListItem item in PhotoGalleryEdit_PhotoShoots.Items)
        {
            if (item.Selected)
                selected.AddFirst(Convert.ToInt32(item.Value));
            else
                notSelected.AddFirst(Convert.ToInt32(item.Value));
        }

 int []arraySelected = selected.ToArray();
 int []arrayNotSelected = notSelected.ToArray();

Может кто-нибудь показать, как это делается в LINQ?

(я пишу весь свой код на C #, но любые ответы, написанные на VB, будут приветствоваться)

Ответы [ 2 ]

6 голосов
/ 13 мая 2009

Из вашего описания, наименее грязный, который я могу придумать, это:

var qry = from ListItem item in listbox.Items
          select new {item.Selected, Value = Convert.ToInt32(item.Value)};

int[] arrSelected=qry.Where(x=>x.Selected).Select(x=>x.Value).ToArray();
int[] arrNotSelected=qry.Where(x=>!x.Selected).Select(x => x.Value).ToArray();

Поскольку вы используете AddFirst, вам также может понадобиться где-то .Reverse() или использовать Array.Reverse() впоследствии.

0 голосов
/ 13 мая 2009
int[] selected = (from item in PhotoGalleryEdit_PhotoShoots.SelectedItems.OfType<MyItem>() select item.Value).ToArray();

Редактировать: добавлен вызов OfType для получения выбранных элементов в IEnumerable.

Редактировать II: Для не выбранных элементов:

int[] notSelected = (from item in PhotoGalleryEdit_PhotoShoots.Items.OfType<MyItem>() where !Array.Exists(selected, x => x == item.Value) select item.Value).ToArray();
...