Dim list As New List(Of String)
list = chkparameter.Items
.Cast(Of ListItem)
.AsEnumerable()
.Where(Function(x) x.Selected)
.Select(Function(x) x.Value)
我得到的错误是
无法投射类型' WhereSelectEnumerableIterator 2[System.Web.UI.WebControls.ListItem,System.String]' to type 'System.Collections.Generic.List
1 [System.String]'。
我怎样才能纠正它。
由于
答案 0 :(得分:0)
如果要将结果分配给List(Of String)
变量,则需要List(Of String)
个对象。您可以在任何可枚举列表中ToList
创建List(Of T)
。
此外,您的AsEnumerable
来电毫无意义,因为Cast(Of T)
已经返回IEnumerable(Of T)
。
最后,在一行上声明变量然后设置其值是不必要的冗长。没错,但没有意义。在您的情况下,您不仅要声明变量,还要创建一个从未使用过的对象。如果你不这样做,就不要创建一个New
对象;实际上你想要一个新对象,而不是因为你在下一行得到了一个对象。
Dim list As List(Of String) = chkparameter.Items.
Cast(Of ListItem).
Where(Function(x) x.Selected).
Select(Function(x) x.Value).
ToList()
还没有必要声明变量的类型,因为它将从初始化表达式中推断出来,即ToList
返回List(Of String)
,因此可以推断出变量的类型从那以后。不是每个人都喜欢使用类型推断,但它并不完全明显,所以我会让你离开那个。我倾向于这样做:
Dim list = chkparameter.Items.
Cast(Of ListItem).
Where(Function(x) x.Selected).
Select(Function(x) x.Value).
ToList()
顺便说一下,注意一些合理的格式化代码读取的容易程度是多少?如果您要使用这样的链式函数语法,一旦获得两个或三个以上的函数,将每个函数放在不同的行上是一个非常好的主意。