我使用ListBox显示数据库中表的内容。每个列表框项都填充了Text属性设置为友好名称,Value属性设置为唯一ID列。数据库结构可能类似于以下内容:
CREATE TABLE GENERIC { FRIENDLY_NAME TEXT, ID INT }
我尝试了近一个小时,使用LINQ将列表框的项目转换为int []并最终失败。区分所选项目和未选择项目也很重要。以下是我最后写的内容:
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编写的任何答案都非常受欢迎)
答案 0 :(得分:6)
根据你的描述,我能想到的最简单的是:
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()
。
答案 1 :(得分:0)
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();