根据列表选择列表框值

本文关键字:列表 选择 | 更新日期: 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);