VB.NET和LINQ查询字典

3

我需要在下面的字典上进行一个简单的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

我需要的是根据以下规则检索出一个单独的网站(字符串类型的字典值)或什么都没有(如果查询找不到可支付结果):
  • 字典键(整数)必须大于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个回答

4

这是一个稍微改进的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块。

-2

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

那么怎么样:

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

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

我不会使用Skip,因为它要求字典必须严格按升序排列。 - dlras2
是的。我只需要一个“是”的回答,如果我已经在最后一个键(startSite)上,则不需要返回任何内容。 - user1413583
我自己找到了一个解决方案,它完美地运行了(简直不敢相信),但我认为应该有一种更“优雅”的方法来实现它(在vb.net中)。等待建议 :) 我因声望低而无法在此处发布其他7小时..现在将其添加到主题中! - user1413583

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