字典上的VB.NET和LINQ查询

时间:2012-05-23 20:49:30

标签: vb.net linq dictionary

我需要在下面的字典上对VB.NET进行简单的LINQ查询,但我对这个主题很新,所以我需要你的帮助。

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim appEnums As New Dictionary(Of Integer, String)

        appEnums.Add(1, "www.eva.com")
        appEnums.Add(2, "www.eva2.com")
        appEnums.Add(4, "www.evanetwork.com")
        appEnums.Add(5, "www.eva3.com")
        appEnums.Add(6, "www.eva4.com")
        appEnums.Add(7, "www.eva5.com")
        appEnums.Add(8, "www.eva6.com")
        appEnums.Add(9, "www.eva1.com")
        appEnums.Add(10, "www.eva7.com")

        Dim startSite As Integer = 1
        Dim mainSite As Integer = 4
        Dim returnSite As Integer = 5
    End Sub

我需要的是在给定这些规则的情况下检索SINGLE网站(字符串类型的字典值)或NOTHING(如果查询无法找到可承受的结果):

  • 字典键(整数)必须大于startSite且不等于mainSite或returnSite(两者都必须从结果中排除)

任何提示?

编辑:感谢迄今为止的回复!我不确定他们是否会工作必须测试它们,乍一看有些奇怪的东西。

我自己找到了一个解决方案并且它完美运行(不能相信)但我认为应该有更“优雅”的方式(总是在vb.net中)。等待建议:)

        Dim resultSite As String

        Try
            resultSite = appEnums.Where(Function(x) x.Key > startSite _
            AndAlso x.Key <> mainSite AndAlso x.Key <> returnSite) _
            .OrderBy(Function(x) x.Key).Select(Function(x) x.Value).First()
        Catch
            resultSite = Nothing
        End Try

2 个答案:

答案 0 :(得分:3)

这是一个稍微精细的LINQ语句。

Dim resultSite As String =
    appEnums.OrderBy(Function(kvp) kvp.Key)
        .SkipWhile(Function(kvp) kvp.Key <= startSite)
        .Where(Function(kvp) kvp.Key <> mainSite AndAlso kvp.Key <> returnSite)
        .Select(Function(kvp) kvp.Value).FirstOrDefault()

它在两个地方与您的解决方案不同:

  • 首先使用OrderBy,以便它可以使用SkipWhile
  • 它使用FirstOrDefault,以避免丑陋的try/catch阻止。

答案 1 :(得分:-2)

当您说一个网站时,您是否只想要符合要求的第一个网站?

怎么样:

dim exclude = new string() {mainSite,returnSite}    

dim result = appEnums.Skip(startSite).Where(function(n) Not exclude.Contains(n.Key)).FirstOrDefault()