SortedDictionary中的第一项?

时间:2016-04-28 14:54:21

标签: vb.net sorteddictionary

有很多很多线程可以从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平台上都不存在。

3 个答案:

答案 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