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

我需要的是在给定这些规则的情况下检索单个网站(字符串类型的字典值)或 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
4

2 回答 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块。
于 2012-05-29T21:18:36.723 回答
-2

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

怎么样:

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

dim result = appEnums.Skip(startSite).Where(function(n) Not exclude.Contains(n.Key)).FirstOrDefault()
于 2012-05-23T21:06:37.197 回答