LINQ ToDictionary如何获取项目索引?

时间:2011-03-29 13:54:42

标签: c# linq-to-objects

我有一个字典,我想转换为另一个字典,使用以下示例隐含的规则:

输入:

Dictionary<string, string> inputs = new Dictionary<string, string>(3)
{
   { "A", "First" },
   { "Z", "Third" },
   { "J", "Second" }
};

输出:

Dictionary<int, string> output = new Dictionary<string, string>(3)
{
   { 0, "First" },
   { 1, "Second" },
   { 2, "Third" }
};

我可以使用lambda语法&amp;没有中间对象?

感谢。

2 个答案:

答案 0 :(得分:8)

字典的枚举顺序是不确定的(即项目没有索引),所以我不确定这是否可行。如何导出整数值?

编辑:

我现在明白了:

inputs
    .OrderBy(input => input.Key)
    .Select((input, index) => new {index, input.Value})
    .ToDictionary(x => x.index, x => x.Value)

答案 1 :(得分:2)

如果您可以定义订单应该是什么,那么我会这样做(我选择按键订购):

Dictionary<string, string> inputs = new Dictionary<string, string>(3)
{
   { "A", "First" },
   { "Z", "Third" },
   { "J", "Second" }
};

var outputs = inputs.OrderBy(i=>i.Key).Select(i=>i.Value).ToArray();

// output
// String [] (3 items):
First 
Second
Third

这会为您提供一个包含您要求的索引的数组(例如output[0])。

如果你真的想要回复字典条目,你可以像这样获得它们的相关数据(你不能只返回字典因为它们是无序的):

var outputs = inputs.OrderBy(i=>i.Key).Select(
  (entry, index) => new KeyValuePair<int, string>(index, entry.Value));

如果需要,请在那里扔.ToArray()

如果你真的想要一本字典,请试试这个:

var outputs = inputs.OrderBy(i=>i.Key)
                    .Select((entry, i) => new { entry.Value, i })
                    .ToDictionary(pair=>pair.i, pair=>pair.Value).Dump();

请记住,词典本身并不是有序的,所以如果你对它进行枚举,你应该再添加一个.OrderBy