2012-03-27 224 views
1

我如何添加排序依据这样的:排序依据和LINQ

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

的问题是,在响应变量返回的JSON有名字的名单,他们都来自一个如此有一个大写首字母分开除了小写字母被卡在SelectListItem列表的底部之外,它们都得到了很好的排序。

任何想法?

在此先感谢..

编辑:

其他信息 - 我使用JSON.NET解析JSON响应。而响应变量是一个JObject。

回答

1

您需要在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

感谢您的快速解答 - 该工作。一堆标准的命令,我试过没有工作,因为响应是来自JSON.NEt的JObject。非常感谢。 – gdp 2012-03-27 15:35:57

0

也许是这样的:

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

方法的语法使用OrderBy方法,你可以指定地址一个StringComparer。传递一个StringComparer忽略套管解决您的问题:

response["holder"] 
    .Children() 
    .OrderBy(m => m["name"], StringComparer.CurrentCultureIgnoreCase); 
0
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

使用这个我得到一个参数错误,我认为它是因为响应本质上是一个可枚举的列表 gdp 2012-03-27 15:35:02

+0

'Children()'的返回类型是什么? – 2012-03-27 15:54:38

+0

可能是错误的是,m [“name”]不是一个字符串。试试.ToString()或者施放它。我在我的帖子中更新了它。 – 2012-03-27 16:00:57

0
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)); 
    } 
}