[英]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
我需要的是,根据这些规则,检索单个网站(字符串类型的字典值)或无(如果查询找不到负担得起的结果):
有什么提示吗?
编辑:感谢到目前为止的答复! 我不确定他们是否必须对它们进行测试,乍看之下有些奇怪。
我自己找到了一个解决方案,它很好用(无法相信),但我认为应该有一种更“优雅”的方法(总是在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.