在 select 之后将字典转换为键值对

Cast A Dictionary after a select to a KeyValue Pair

所以我有一个字典 (Employees2Name) Of int => (some class) 我需要将其转换为 int => (some 属性 in class)

我的这个工作正常,这是个好消息。看起来我正在做一个额外的步骤,有没有办法在 linq 中通过强制转换来缩短它。

ComboBoxValues.Employees2Name.Select(k => new {Key = k.Key, Value = k.Value.Name})
                             .ToDictionary(k => k.Key, v => v.Value)
                             .ToList<KeyValuePair<int, string>>()
                             .OrderBy(kp => kp.Value)

字典的第二个似乎多余。

看来你只需要

ComboBoxValues.Employees2Name
  .Select(k => new KeyValuePair<int, string>(k.Key, k.Value.Name))
  .OrderBy(item => item.Value);

只是 SelectOrderBy;尽量不要 materialize(即 ToList()ToDictionary()),尤其是 在 Linq 的中间

无需使用 selectorderby。你可以试试这个

SortedList<int, string> sortedList = 
    new SortedList<int, string>(ComboBoxValues.Employees2Name
                                 .ToDictionary(i => i.Key, i => i.Value.Name));

字典 class 已经实现了 IEnumerable>,这是您的 OrderBy() 的有效输入,然后应用 ToList>() 似乎完全没用。

此外,我认为 ToDictionary 调用是浪费内存和时间,因为您是从一个简单的项目集合构建字典(其主要目的是通过键保持项目的唯一性),然后按以下方式对它们进行排序值(而不是键),因此没有利用 Dictionary<,> class.

我会将您的代码重写为

ComboBoxValues.Employees2Name.Select(k => new KeyValuePair<int, string>(k.Key, k.Value.Name))
                             .OrderBy(kp => kp.Value)

此致, 丹尼尔.

@Servy 评论反映最佳答案。 你已经在
IEnumberable<KeyPairValue<int, Class>> 你只需要将名字放入字典然后按

排序
@Html.PopulateCombobox(ComboBoxValues.Employees2Name
                                     .ToDictionary(k => k, v => v.Value.Name)
                                     .OrderBy(v => v.Value)