繁体   English   中英

字典上的VB.NET和LINQ查询

[英]VB.NET and LINQ query on a 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

我需要的是,根据这些规则,检索单个网站(字符串类型的字典值)或无(如果查询找不到负担得起的结果):

  • 字典键(整数)必须大于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

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

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

怎么样:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM