根据列表选择列表框值
本文关键字:列表 选择 | 更新日期: 2023-09-27 18:01:51
我有一个列表:
var _books = new List<int> {233,5,20};
和一个包含很多书的ListBox(它们的值是一个item id)
我如何使用这个工作代码:
var t = from ListItem n in lbBooks.Items
where _books.Contains(int.Parse(n.Value))
select n;
foreach(ListItem i in t)
{
i.Selected = true;
}
并将其转换为lambda:
lbBooks.Items.Cast<ListItem>()
.Where(n => _books.Contains(int.Parse(n.Value)))
.Select(n => n.Selected = true);
最好的选择?不喜欢。LINQ查询应该只是查询。而且查询不应该有副作用。你使用foreach
的方法非常好。
如果你真的想,你可以创建自己的扩展方法ForEach()
,类似于List<T>
,但我不认为这是一个好主意。
您离此不远了,您需要返回整个对象并将Selected设置为true。比如:
lbBooks.Items.Cast<ListItem>()
.Where(n => _books.Contains(int.Parse(n.Value)))
.Select(n => SetSelected(n));
如果您喜欢
,可以将上面的select缩短为.Select(SetSelected);
。private ListItem SetSelected(ListItem listItem)
{
listItem.Selected = true;
return listItem
}
另外,为了保存铸造,你可以利用SetSelected来处理你的铸造,一旦你有你想要的记录。你的查询将变成:
lbBooks.Items.Where(n => _books.Contains(int.Parse(n.Value)))
.Select(n => SetSelected(n));
private ListItem SetSelected(Item item)
{
ListItem result = item as ListItem;
result.Selected = true;
return result;
}
没有内置的ForEach扩展方法。您可以创建自己的,但我不认为您的代码有任何问题。
转换为.ToList()
,并使用' ForEach'操作符:
lbBooks.Items.Cast<ListItem>()
.Where(n => _books.Contains(int.Parse(n.Value)))
.Select(n => n).ToList().ForEach(n=> n.Selected=true);