旨在实现: 我想在列表的每个成员的末尾添加prevMonth的名称。
我有两个相同的实现,1个工作,但其他的是异常。
工作代码:
prevMonthSheetNames = addMonth(monthlySheetNames, prevMonth)
Private Function addMonth(ByVal list As IEnumerable(Of String), ByVal month As String) As List(Of String)
Return list.Select(Function(name) String.Concat(name) + " (" + month + ")").ToList()
End Function
使用例外实施:
prevMonthSheetNames = monthlySheetNames.Select(Function(name) String.Concat(name) + " (" + prevMonth + ")").ToList()
错误:'System.Collections.Generic.List(Of Object)'类型的值无法转换为'System.Collections.Generic.List(Of String)'
如果我从上面删除.ToList(),那么:
异常:无法转换'WhereSelectListIterator
2[System.String,System.Object]' to type 'System.Collections.Generic.List
1 [System.String]'类型的对象。
请帮助,发生了什么 - 似乎是相同的,但是1给出了错误而其他没有?
monthlySheetNames
声明:
Private monthlySheetNames As New List(Of String)(New String() {"Salary", "Budget", "Loans"})
答案 0 :(得分:3)
在第二个示例中,匿名函数返回Object
而不是String
,因此投射失败。
首先,转到项目属性,并确保项目属性的编译标签上的Option Strict 开启。
然后,仔细查看prevMonth
声明
你怎么分配它?它的类型是什么?你确定它是String
吗?
使用lambda expression来确保它返回String
也可能有所帮助。对,它有点混乱:
Function(name) String.Concat(name) + " (" + prevMonth + ")"
String.Concat
连接参数,你只给它一个。这个电话没用
另外,如果prevMonth
实际上不是String
,我不确定VB .NET将如何应用+
运算符。
毕竟,使用String.Format
suggested by Smudge002会更简单(更安全):
Function(name) String.Format("{0} ({1})", name, prevMonth)
至少,您确定 返回String
。
答案 1 :(得分:2)
问题可能与您使用'+'运算符有关。你应该使用'&'用于在VB.Net中连接。此外,使用String.Concat函数是多余的 - 它不会有任何影响。试试这个。
Option Explicit On
Option Strict On
prevMonthSheetNames = monthlySheetNames.Select(Function(name) name & " (" & prevMonth & ")").ToList()
我不确定两个版本之间的区别是什么。可能是,这是由于参数值的隐式转换。我在代码示例中包含了一些语句,这些语句将确保启用Option Strict和Option Explicit。这可能有助于解决这些问题。
答案 2 :(得分:2)
试试这个......
Public Function GetSheetNamesForMonth(byval sheetNames As IEnumerable(Of String), Byval monthName As String) As IEnumerable(Of String)
Return sheetNames.Select(Function(n) String.Format("{0}({1})", n, monthName))
End Function