Орден и Линк - PullRequest
       30

Орден и Линк

1 голос
/ 27 марта 2012

Как я могу добавить orderby к этому:

return (from m in response["holder"].Children()
                orderby m["name"]
                select new SelectListItem
                {
                    Text = m["name"].ToString(),
                    Value = m["name"].ToString()
                }).ToList();

Проблема в том, что у json, возвращаемого в переменной response, есть список имен, все они имеют заглавную первую букву, кроме одной, поэтому онивсе хорошо упорядочено, кроме одного со строчными буквами, которое застревает внизу списка SelectListItem.

Есть идеи?

Заранее спасибо ..

РЕДАКТИРОВАТЬ:

Дополнительная информация - я использую JSON.NET для анализа ответа JSON.И переменная ответа - это JObject.

Ответы [ 5 ]

1 голос
/ 27 марта 2012

Вам необходимо нормализовать данные во время вашего orderby. В моем примере я выбрал метод ToUpperInvariant():

return (from m in response["holder"].Children()
        orderby m["name"].ToUpperInvariant()
        select new SelectListItem
        {
            Text = m["name"].ToString(),
            Value = m["name"].ToString()
        }).ToList();

Я также предполагаю, что m["name"] уже является String объектом. Если это не так, измените строку на:

orderby m["name"].ToString().ToUpperInvariant()
0 голосов
/ 27 марта 2012
return response["holder"].Children()
               .Select(m => m.FirstCharToUpper())
               .OrderBy(m => m["name"].ToString())
               .Select(m => new SelectedListItem{
                   Text = m["name"].ToString(),
                   Value = m["name"].ToString()
               })
               .ToList();

static class Utility
{
    public static string FirstCharToUpper(this string s)
    {
        return s.First().ToString().ToUpper() + string.Join("", s.Skip(1));
    }
}
0 голосов
/ 27 марта 2012
response["holder"]
  .Children()
  .OrderBy(m => m["name"] as String, StringComparer.CurrentCultureIgnoreCase)
  .Select(m => new SelectedListItem 
                   {
                       Text = m["name"].ToString(),
                       Value = m["name"].ToString())
                   })
  .ToList();
0 голосов
/ 27 марта 2012

При использовании метода OrderBy в синтаксисе метода вы можете указать StringComparer.Прохождение StringComparer, которое игнорирует корпус, решает вашу проблему:

response["holder"]
  .Children()
  .OrderBy(m => m["name"], StringComparer.CurrentCultureIgnoreCase);
0 голосов
/ 27 марта 2012

Может быть, что-то вроде этого:

return (from m in response["holder"].Children()
                orderby m["name"].ToString().ToLower()
                select new SelectListItem
                {
                    Text = m["name"].ToString(),
                    Value = m["name"].ToString()
                }).ToList();
...