-1

我有一本类型的字典Dim dictionaryOfAlertsForSC As New Dictionary(Of String, List(Of AlertsBO))。字典总是有两条记录。我需要根据密钥过滤掉记录。我在字典上使用 Linq:

lstAlertsForSC = From kv As KeyValuePair(Of String, List(Of AlertsBO)) In dictionaryOfAlertsForSC Where kv.Key.Contains(ASSESSMENTS) Select kv.Value

其中 lstAlertForSC 是 AlertBo 类型的列表。它为 Linq 查询中的选择部分引发了一些类型转换的运行时错误。异常详情:

Unable to cast object of type 'WhereSelectEnumerableIterator`2[System.Collections.Generic.KeyValuePair`2[System.String,System.Collections.Generic.List`1[MA.DMR.HCSIS.Common.AlertsBO]],MA.DMR.HCSIS.Common.AlertsBO]' to type 'System.Collections.Generic.List`1[MA.DMR.HCSIS.Common.AlertsBO]'.

这是我的详细代码:

 Public Sub GenerateSCAlert(ByVal userInfo As UserInfoType)
    Dim ispAlertProcessDAO As ISPAlertProcessDAO
    Dim lstAlertsForSC As New List(Of AlertsBO)
    Dim dictionaryOfAlertsForSC As New Dictionary(Of String, List(Of AlertsBO))
    Dim strAlertBOXML As String
    strAlertBOXML = String.Empty
    Try
        LoggingHelper.Log("----------------------ISP Action based Alert Management process for SC started----------------------", TraceEventType.Information, MethodBase.GetCurrentMethod(), LoggingHelper.ISPProcesses.ISPAlertForSC)
        ispAlertProcessDAO = New ISPAlertProcessDAO(userInfo)
        dictionaryOfAlertsForSC = ispAlertProcessDAO.GenerateSCAlert()
        If (dictionaryOfAlertsForSC.Count > 0) Then
            lstAlertsForSC = From kv As KeyValuePair(Of String, List(Of AlertsBO)) In dictionaryOfAlertsForSC Where kv.Key.Contains(ASSESSMENTS) Select kv.Value.Single()
            If (lstAlertsForSC.Count > 0) Then
                strAlertBOXML = ispAlertProcessDAO.GenerateXMLForActionBasedAlerts(True, lstAlertsForSC)

我在应用 Linq 的地方遇到了一个例外。

我的应用程序在 VB.Net 中,但如果需要,C# 也可以。

4

1 回答 1

1

如果要获取特定键的元素,只需使用适当的访问器:

lstAlertsForSC = dictionaryOfAlertsForSC(ASSESSMENTS)

您的 LINQ 查询

From kv As KeyValuePair(Of String, List(Of AlertsBO)) 
    In dictionaryOfAlertsForSC 
    Where kv.Key.Contains(ASSESSMENTS) 
    Select kv.Value

返回一个可以遍历查询的所有结果的枚举器。当然,编译器并不知道查询只能返回一个元素。这就是为什么结果是某种IEnumerable(Of List(Of String)).

有一个扩展方法IEnumerable(Of T)可以获取单个元素。对查询结果调用此方法会为您提供所需的列表:

lstAlertsForSC = 
    (From kv As KeyValuePair(Of String, List(Of AlertsBO)) 
        In dictionaryOfAlertsForSC 
        Where kv.Key.Contains(ASSESSMENTS) 
        Select kv.Value).Single()

如果您按如下方式保留括号:

lstAlertsForSC = 
    From kv As KeyValuePair(Of String, List(Of AlertsBO)) 
        In dictionaryOfAlertsForSC 
        Where kv.Key.Contains(ASSESSMENTS) 
        Select kv.Value.Single()

然后Single()在 each 上调用该方法kv.Value,您将得到 ab IEnumerable(Of String)。但是,此查询可能会失败,因为内部列表可能不包含单个值。

于 2013-09-17T06:48:20.030 回答