SortedDictionary中的第一项?

Mau*_*itz 2 vb.net sorteddictionary

关于从a获得"第一"项目的方法有很多很多线索Dictionary,以及为什么这样的事情不是一个好主意的各种答案,因为没有内部排序.但我的是a SortedDictionary,所以这些论点不适用.然而,我无法找到一种方法来获得Nth项目,而SortedDictionary不是一个Dictionary.

这是我的SD:

FRs As SortedDictionary(Of DateTime, ScheduleItem)
Run Code Online (Sandbox Code Playgroud)

我看到了一些我应该能做的提示:

If FRs.Count = 1 Then
    FirstFR = FRs.Keys(0)
Run Code Online (Sandbox Code Playgroud)

但这在我的代码中无效 - 它表示它没有默认值,也无法编入索引..FirstLINQ中似乎都有其他选项,我无法定位.那么以这种方式访问​​它有什么简单的方法吗?

注意:提供的任何解决方案都不能使用LINQ,这在许多非Wintel平台上都不存在.

Tim*_*ter 5

问题是a SortedDictionary确实是由密钥排序的.但这并不意味着您可以通过索引访问它.所以如果你不能使用LINQ:

Dim firstFR As KeyValuePair(Of DateTime, ScheduleItem)
For Each kv In FRs
    firstFR = kv
    Exit For
Next
Run Code Online (Sandbox Code Playgroud)

否则你可以简单地使用First/ FirstOrDefault.

旁注:由于a KeyValuePair(Of Tkey, TValue)是一个结构,因此是一个值类型,它永远不会是null/ Nothing.你可以用这种丑陋的方式检查一本空字典:

If firstFR.Equals(New KeyValuePair(Of DateTime, ScheduleItem))
    Console.WriteLine("Empty dictionary")
End If 
Run Code Online (Sandbox Code Playgroud)

所以它的可读性更强If FRs.Count = 0 Then ....


更新:如果您只想要给定索引处的键或值,您可以使用:

Dim firstSchedule As Date = FRs.Keys(0)
Run Code Online (Sandbox Code Playgroud)

或者第一个Date:

Dim firstDate As ScheduleItem = FRs.Values(0)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,即使没有LINQ,您也可以通过索引获得两个:

Dim firstFR = new KeyValuePair(Of DateTime, ScheduleItem)(FRs.Keys(0), FRs.Values(0))
Run Code Online (Sandbox Code Playgroud)

免责声明:根据我在这里的问题,这只有在你导入的情况下才有效System.Linq,然后Enumerable.ElementAt隐式使用,如果类型没有实现,它会枚举序列以通过索引查找项目IList(Of T).所以在这种情况下不要使用它.