有很多很多线程可以从Dictionary
获取“第一”项目,还有各种答案,为什么这样的事情不是一个好主意,因为有没有内部订购。但我的是SortedDictionary
,所以这些论点不适用。然而,我找不到从SortedDictionary
获取第N项的方法比Dictionary
更容易。
这是我的SD:
FRs As SortedDictionary(Of DateTime, ScheduleItem)
我看到了一些我应该能够做的提示:
If FRs.Count = 1 Then
FirstFR = FRs.Keys(0)
但这在我的代码中无效 - 它表示它没有默认值,也无法编入索引。 .First
和其他选项似乎都在LINQ中,我无法定位。那么以这种方式访问它有什么简单的方法吗?
注意:提供的任何解决方案都不得使用LINQ ,这在许多非Wintel平台上都不存在。
答案 0 :(得分:5)
问题是密钥确实按SortedDictionary
排序。但这并不意味着您可以通过索引访问它。所以,如果你不能使用LINQ:
Dim firstFR As KeyValuePair(Of DateTime, ScheduleItem)
For Each kv In FRs
firstFR = kv
Exit For
Next
否则您只需使用First
/ FirstOrDefault
。
旁注:由于KeyValuePair(Of Tkey, TValue)
是一个结构,因此是一个值类型,因此它永远不会是null
/ Nothing
。你可以用这种丑陋的方式检查一本空字典:
If firstFR.Equals(New KeyValuePair(Of DateTime, ScheduleItem))
Console.WriteLine("Empty dictionary")
End If
因此使用If FRs.Count = 0 Then ...
更具可读性。
<击> 更新:如果您只想要给定索引处的键或值,您可以使用:
Dim firstSchedule As Date = FRs.Keys(0)
或其中的第一个Date
:
Dim firstDate As ScheduleItem = FRs.Values(0)
通过这种方式你甚至可以通过索引得到两个LINQ:
Dim firstFR = new KeyValuePair(Of DateTime, ScheduleItem)(FRs.Keys(0), FRs.Values(0))
击> <击> 撞击>
免责声明:根据my question here,仅当您导入System.Linq
时才会有效,然后会隐式使用Enumerable.ElementAt
,如果类型不是&#39,则会枚举序列以通过索引查找项目; t实现IList(Of T)
。所以在这种情况下不要使用它。
答案 1 :(得分:2)
Linq大多只是一系列扩展方法,所以你可以写自己的:
Imports System
Imports System.Collections.Generic
Imports System.Runtime.CompilerServices
Public Module EnumerableExtensions
<Extension()>
Public Function FirstValue(Of TKey, TValue)(source As SortedDictionary(Of TKey, TValue)) As TValue
For Each kvp In source
Return kvp.Value
Next
Return Nothing
End Function
End Module
Public Module Module1
Public Sub Main()
Dim a As SortedDictionary(Of string, string) = new SortedDictionary(Of string, string)
a.Add("foo", "1 - foo")
a.Add("bar", "2 - bar")
Console.WriteLine(a.FirstValue())
End Sub
End Module
以下是dotnetfiddle中运行的示例。
答案 2 :(得分:0)
刚刚实现了
''' <summary>
''' return the first object of a sortedDictionary
''' </summary>
''' <typeparam name="TKey">Key tpye</typeparam>
''' <typeparam name="TValue">value type</typeparam>
''' <param name="source">dictionary</param>
''' <returns></returns>
<Extension()>
Public Function FirstValue(Of TKey, TValue)(source As SortedDictionary(Of TKey, TValue)) As TValue
For Each kvp As TValue In source.Values
Return kvp
Next
Return Nothing
End Function
''' <summary>
''' return the last object of a sortedDictionary
''' </summary>
''' <typeparam name="TKey">Key type</typeparam>
''' <typeparam name="TValue"> value type</typeparam>
''' <param name="source"> dictionary</param>
''' <returns>the last object or nothing for an empty dictionary</returns>
<Extension()>
Public Function lastValue(Of TKey, TValue)(source As SortedDictionary(Of TKey, TValue)) As TValue
Dim lv As TValue = Nothing
For Each kvp As TValue In source.Values
lv = kvp
Next
Return lv
End Function