【问题标题】:How to order when using ToDictionary()使用 ToDictionary() 时如何排序
【发布时间】:2013-10-04 19:55:26
【问题描述】:

我被要求在 ComboBox 中添加一个“ALL”项,该查询被指定为其数据源,“ALL”项应该是控件中第一个看到的项

        Dim qryEmp = From emp In db.Members.ToList
                        Order By emp.LogonId Ascending
                        Select New GPUserQueryResult With {
                            .LoginId = emp.LogonId,
                            .FullName = GetUserName(emp.LogonId)
                        }

我最终使用的代码是这样的:

            Dim allUser() As GPUserQueryResult = {New GPUserQueryResult With {.LoginId = -1, .FullName = AllValues}}
            Dim addEmpty As IEnumerable(Of GPUserQueryResult) = allUser

            Dim allRecs As IEnumerable(Of GPUserQueryResult) = addEmpty.Union(qryEmp)

            EmpList = allRecs.ToDictionary(Function(x) x.LoginId, Function(x) x.FullName)

虽然我一开始试过这个:

            Dim allUser() As GPUserQueryResult = {New GPUserQueryResult With {.LoginId = -1, .FullName = AllValues}}
            Dim addEmpty As IEnumerable(Of GPUserQueryResult) = allUser

            Dim allRecs As IEnumerable(Of GPUserQueryResult) = qryEmp.Union(addEmpty)

            EmpList = allRecs.ToDictionary(Function(x) x.LoginId, Function(x) x.FullName)
            EmpList.Keys.OrderBy(Function(x) x)

但“ALL”项始终是最后一项,即使我尝试使用 OrderBy 方法,有人可以解释为什么吗?如果这是实现目标的最佳方式

【问题讨论】:

  • 字典是键/值对的无序集合。如果您想订购,请使用OrderedDictionary 或推出您自己的。
  • 我知道字典无法排序,我想我认为通过 Keys 上可能的 OrderBy,它可以对容器中的 Key 值进行排序。
  • 在集合上使用诸如OrderBy() 之类的方法不会修改它,它只会创建一个在迭代时应用的集合视图。如果您遍历 OrderBy() 调用的结果,您将看到“有序”键。
  • 感谢您为我解决这个问题

标签: vb.net linq-to-sql ienumerable


【解决方案1】:

我在上面尝试了您的代码,并按预期首先显示了“ALL”项目。不知道为什么它对你不起作用。但是,另一种更简单的方法可以满足您的需要:

Dim qryEmp = .... ' your existing linq to retrieve employees

现在您需要将“ALL”项目插入到第一个位置。首先将qryEmp转换为List对象:

Dim EmpList = qryEmp.ToList()

在位置 0 处插入“ALL”项:

EmpList.Insert(0, New GPUserQueryResult With {.LoginId = -1, .FullName = AllValues})

将列表绑定到 ComboBox:

ComboBox1.DisplayMember = "FullName"
ComboBox1.ValueMember = "LoginId"
ComboBox1.DataSource = New BindingSource(EmpList, Nothing)

示例:

【讨论】:

  • 我知道如何在 List(of T) 中做到这一点,我试图用 Dictionary 来实现同样的目标,但 Dictionary 只是因为它像一个数据源一样工作,所以有点矫枉过正。
猜你喜欢
  • 2013-09-06
  • 1970-01-01
  • 2011-12-14
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多