почему возвращение JsonResult из словаря изменяет порядок сортировки? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть следующее действие контроллера:

public JsonResult GetInvestors(int bank)
{
    var investors = _context.Investors
    .Where(i => i.BankNumber == bank)
    .Select(i => new { InvestorId = i.InvestorId.ToString(), InvestorName = i.InvestorName + " (" + i.BankNumber + ")" })
    .OrderBy(i => i.InvestorName)
    .ToDictionary(i => i.InvestorId, i => i.InvestorName);

    return Json(investors, JsonRequestBehavior.AllowGet);
}

И следующий javascript для вызова этого действия, которое сейчас просто запускает отладчик, чтобы я мог просмотреть результат:

function getInvestors(bank)
{
    $.ajax
    ({
        url: "/InvestorDetail/GetInvestors",
        type: "POST",
        data: { bank: bank },
        dataType: "json",
        success: function (returnedData) { debugger; }
    });
}

Если я смотрю investors в действии контроллера, оно сортируется по имени инвестора, что я и хочу. Однако, когда я попадаю в отладчик javascript и наблюдаю returnedData, данные поступают отсортированными по идентификатору инвестора.

Альтернативно, если я помещу OrderBy после ToDictionary и order by Value, в отладчике javascript jsonСтруктура результата отличается, но сортируется по имени инвестора, как я хочу.

Почему порядок сортировки изменяется при возврате из словаря?

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вы не можете отсортировать словарь, хотя вы можете получить представление отсортированного словаря!

Вы можете попробовать что-то вроде

import collections

Dictionary_Sorted = collections.OrderedDict(x)

x как объекта с ключами.

То же самое относится и к C #.

Мне нравится менять свой словарь на список, скажем.

var newList = thisDictionary.ToList();
newList.Sort((a,b) => a.Value.CompareTo(b.Value));

Мне нравится подход с одним вкладышем. Это просто и элегантно. Если вы хотите отсортировать его по убыванию, переключите значения как таковые.

   newList.Sort((a,b) => b.Value.CompareTo(a.Value));
1 голос
/ 23 октября 2019

В целях перечисления каждый элемент в словаре рассматривается как структура KeyValuePair, представляющая значение и его ключ. Порядок, в котором элементы возвращаются, не определен.

См. официальную документацию msdn

Вы можете использовать отсортированные словари или правильно отсортировать их на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...