C#中使用Linq选择ListViewItemCollections中的项

16

如何使用C#中的Linq从ListViewItemCollections选择一个ListViewItem?

我尝试使用以下代码,但它没有起作用。

ListViewItemCollections lv = listview1.items;

var test = from xxx in lv where xxx.text = "data 1" select xxx;


test   <--- now has the listviewitem with "data 1" as string value..
4个回答

34
要获得 ListViewItem 的枚举器,您需要将 ListView 的 Items 集合强制转换为枚举器:
IEnumerable<ListViewItem> lv = listview1.items.Cast<ListViewItem>();

然后,你可以使用 LINQ:

 var test = from xxx in lv 
            where xxx.text = "data 1" 
            select xxx;

2
我认为你应该使用:listview1.items.OfType<ListViewItem>(); 来避免可能的类型转换异常。 - Preet Sangha
3
@ Preet Sangha:我不认为这是必要的,因为被添加到 ListView 中的项目总是可以转换为“ListViewItem”。 - Homam

7
ListViewItemCollections lv = listview1.items;

var test = from ListViewItem xxx in lv where xxx.text == "data 1" select xxx;

或者
listview1.items.Cast<ListViewItem>().Where(i => i.text == "date 1");

2

如果您想仅限于一个列进行搜索,可以使用

IEnumerable<ListViewItem> lv = listView.Items.Cast<ListViewItem>();

var rows =  from x in lv
            where x.SubItems[columnIndex].Text == searchTerm
            select x;

if (rows.Count() > 0)
{
    ListViewItem row = rows.FirstOrDefault();

    //TODO with your row
}

1

ListViewItemCollection 只实现了 IEnumerable(而不是 IEnumerable<ListViewItem>),因此编译器无法推断出 xxx 的类型,从而导致 LINQ 查询无法工作。

您需要将集合强制转换才能像下面这样使用它:

var test = from xxx in lv.Cast<ListViewItem>() where xxx.text="data 1" select xxx;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接