为什么我不能在ListView.SelectedItems上使用LINQ?

10
我正在尝试在ListView.SelectedItems上使用.Select扩展方法,它是SelectedListViewItemCollection,但是.Select在智能感知中没有显示。
我可以在SelectedListViewItemCollection上使用foreach,所以它一定实现了IEnumerable。我刚刚在MSDN上检查了一下,确实如此。那么为什么LINQ扩展方法不能在其上使用呢?
3个回答

27

之所以这样是因为SelectedItems被定义为实现了IEnumerable接口的集合类型。而Select扩展方法只适用于IEnumerable<T>类型,所以它不能与SelectedItems一起使用。

解决方法是使用.Cast扩展方法将其转换为适当的类型,这样就可以显示出来了。

ListView.SelectedItems.Cast<SomeType>.Select(...)

@Joan,我其实不确定。我认为它是底层项而不是ListViewItem。我在文档中找不到答案。 - JaredPar
谢谢Jared。只是想确认一下。 - Joan Venge
1
@JaredPar - 这对你实际起作用了吗?还是你需要我的ListView.SelectedItems.Cast<ListViewItem>().Select( ... )? - B H
谢谢!我一直在寻找为什么类似的集合不起作用,真是太久了! - Sidney

5

它实现了IEnumerable接口,而不是泛型的IEnumerable<T>接口。所有的LINQ查询都围绕着泛型的IEnumerable<T>接口来构建,这样可以保证类型安全和泛型推断 - 特别是在处理匿名类型时。

你可以使用以下代码替换:

myListView.SelectedItems.Cast<ListViewItem>.Select( ... );

2
@LBushkin - 这对您是否有效,或者您需要使用myListView.SelectedItems.Cast<ListViewItem>().Select( ... )? - B H

2

您的文件顶部是否有“using System.Linq”?

它是一个强类型的通用集合吗?如果不是,您将需要使用Cast<>扩展方法。


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