我有一个清单:
var _books = new List<int> {233,5,20};
包含大量书籍的ListBox(其值为商品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);
答案 0 :(得分:1)
你不远处,你需要返回整个对象并将Selected设置为true。类似的东西:
lbBooks.Items.Cast<ListItem>()
.Where(n => _books.Contains(int.Parse(n.Value)))
.Select(n => SetSelected(n));
以上。如果您愿意,选择可以缩短为.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;
}
答案 1 :(得分:1)
最好的选择?别。 LINQ查询应该只是 - 查询。查询不应该有副作用。使用foreach
的方法非常好。
如果您真的想要,可以创建自己的扩展方法ForEach()
,类似于List<T>
上的方法,但我认为这不是一个好主意。
答案 2 :(得分:0)
转换为.ToList()
并使用`ForEach'运算符:
lbBooks.Items.Cast<ListItem>()
.Where(n => _books.Contains(int.Parse(n.Value)))
.Select(n => n).ToList().ForEach(n=> n.Selected=true);
答案 3 :(得分:0)
没有build in ForEach extension method。您可以创建自己的代码,但我没有看到您的代码有任何问题。