Преобразовать ключи и значения из словаря в массив String[]

#c# #web-services #jquery-ui

#c# #веб-сервисы #jquery-пользовательский интерфейс

Вопрос:

У меня есть функция webservice, которая возвращает что-то вроде следующего:

  • Новый Орлеан, Луизиана
  • Нью-Йорк, New York
  • Ньюарк, Нью-Джерси

Эти данные поступают из следующей функции:

 [WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string[] GetCitiesWithState(string isoalpha2, string prefixText)
{
    var dict = AtomicCore.CityObject.GetCitiesInCountryWithStateAutocomplete(isoalpha2, prefixText);
    string[] cities = dict.Values.ToArray();
    return cities;
}
  

Это работает замечательно, но что мне действительно нужно, так это такой список:

  • 12, Новый Орлеан, Луизиана
  • 22, Нью-Йорк, New York
  • 48, Ньюарк, Нью-Джерси

С #, являющимся идентификатором города (он содержится с dict , который является типом: Dictionary<int, string> ).

Причина, по которой я это делаю, заключается в том, что у меня есть некоторый Jquery, который считывает службу ASMX и этот метод, и мне нужно иметь возможность видеть идентификатор города выбранного города. Это мой Jquery для наглядности (который работает в настоящее время):

 $('#<%=txtCity.ClientID%>').autocomplete({
            source: function (request, response) {
                var parameters = {
                    isoalpha2: '<%=Session["BusinessCountry"].ToString()%>',
                    prefixText: request.term
                };
                $.ajax({
                    url: '<%=ResolveUrl("~/AtomicService/Assets.asmx/GetCitiesWithState")%>',
                    type: 'POST',
                    dataType: 'json',
                    contentType: 'application/json; charset=utf-8',
                    data: JSON.stringify(parameters),
                    success: function (data) {
                        response($.each(data.d, function (index, value) {
                            return {
                                label: value,
                                value: index
                            }
                        }));
                    }

                });
            },
            select: function (event, ui) {
                $('#<%=txtState.ClientID%>').val(ui.value);
            },
            minLength: 2,
            delay: 500
        });
  

Наконец, чего я на самом деле пытаюсь достичь, так это когда пользователь выбирает город в автозаполнении, который находится в режиме ожидания от: $('#<%=txtCity.ClientID%>') , я бы хотел, чтобы Jquery разделил значение (например, Новый Орлеан, Луизиана на два (Новый Орлеан) и (Луизиана)), затем я бы хотел, чтобы «Новый Орлеан» был значением $('#<%=txtCity.ClientID%>') , а «Луизиана» была значением $('#<%=txtState.ClientID%>') … Всегда приветствуется любая помощь в запуске этого безумия 🙂

Ответ №1:

Если я вас правильно понял, вам просто нужно вернуть данные из веб-метода немного по-другому:

 [WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string[] GetCitiesWithState(string isoalpha2, string prefixText)
{
    var dict = AtomicCore.CityObject.GetCitiesInCountryWithStateAutocomplete(isoalpha2, prefixText);
    string[] response = dict.Select(x => String.Format("{0}, {1}", x.Key, x.Value)).ToArray();
    return response;
}
  

И теперь, на стороне JavaScript, вам нужно разбить строку на index и label вручную (потому что то, что index теперь — это просто номер строки, я полагаю). Что-то вроде этого (просто черновик):

 response($.each(data.d, function (index, value) {
    return {
        label: value.slice(value.indexOf(',')),
        value: parseInt(value.split(',')[0])
     }
 }));
  

Комментарии:

1. Отличный ответ A. 🙂 Большое спасибо. LINQ особенно эффективен!