我需要在下面的字典上对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(如果查询无法找到可承受的结果):
任何提示?
编辑:感谢迄今为止的回复!我不确定他们是否会工作必须测试它们,乍一看有些奇怪的东西。我自己找到了一个解决方案并且它完美运行(不能相信)但我认为应该有更“优雅”的方式(总是在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
答案 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()