根据List选择ListBox值

时间:2011-07-09 21:10:12

标签: c# asp.net linq

我有一个清单:

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);

4 个答案:

答案 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。您可以创建自己的代码,但我没有看到您的代码有任何问题。