First item in a SortedDictionary?

前端 未结 2 691
梦谈多话
梦谈多话 2021-01-21 04:10

There are many, many threads on ways to get the \"first\" item from a Dictionary, and various answers as to why such a thing is not really a good idea beca

相关标签:
2条回答
  • 2021-01-21 04:26

    The problem is that a SortedDictionary is indeed ordered by the key. But that does not mean that you can access it via index. So if you can't use LINQ:

    Dim firstFR As KeyValuePair(Of DateTime, ScheduleItem)
    For Each kv In FRs
        firstFR = kv
        Exit For
    Next
    

    Otherwise you could simply use First/ FirstOrDefault.

    Sidenote: since a KeyValuePair(Of Tkey, TValue) is a structure, therefore a value type, it is never null/Nothing. You could check for an empty dictionary in this ugly way:

    If firstFR.Equals(New KeyValuePair(Of DateTime, ScheduleItem))
        Console.WriteLine("Empty dictionary")
    End If 
    

    So it's much more readable to use If FRs.Count = 0 Then ....


    Update: if you just want the key or value at a given index you can use:

    Dim firstSchedule As Date = FRs.Keys(0)
    

    or the first Date in it:

    Dim firstDate As ScheduleItem = FRs.Values(0)
    

    On this way you could actually get both via index even without LINQ:

    Dim firstFR = new KeyValuePair(Of DateTime, ScheduleItem)(FRs.Keys(0), FRs.Values(0))
    

    Disclaimer: according to my question here this works only if you have imported System.Linq, then Enumerable.ElementAt is used implicitly which enumerates a sequence to find an item via index if the type doesn't implement IList(Of T). So don't use it in this case.

    0 讨论(0)
  • 2021-01-21 04:45

    Linq is mostly just a series of extension methods, so you can write own:

    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
    

    Here's the example running in dotnetfiddle.

    0 讨论(0)
提交回复
热议问题