LINQ ToDictionary как получить индекс элемента? - PullRequest
4 голосов
/ 29 марта 2011

У меня есть словарь, который я хочу преобразовать в другой словарь, используя правило, подразумеваемое приведенным ниже примером:

Входные данные:

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" }
};

Могу ли я сделать это, используя лямбда-синтаксис без посредников?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 29 марта 2011

Порядок перечисления словаря является неопределенным (то есть элементы не имеют индекса), поэтому я не уверен, что это возможно. Как будут получены целочисленные значения?

EDIT:

Теперь я понял:

inputs
    .OrderBy(input => input.Key)
    .Select((input, index) => new {index, input.Value})
    .ToDictionary(x => x.index, x => x.Value)
2 голосов
/ 29 марта 2011

Если вы можете определить, каким должен быть порядок, то я бы сделал это следующим образом (я выбрал порядок по ключу):

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.

...