Linq to XML如何按照降序排序?

5

我遇到了OrderByDescending的问题,它不能正确排序。我的XML文件如下:

  <player id="3">
     <name>David, Backham</name>      
     <goals>155</goals>        
  </player>

我尝试展示进球数最高的3位球员。
 XDocument doc = XDocument.Load("players.xml");

                                     /// .OrderByDescending(r => r.Attribute("goals"))
        var players = from r in doc.Descendants("player").OrderByDescending(r => r.Value)

                           select new
                           {
                               Name = r.Element("name").Value + "   ",
                               Goal = r.Element("goals").Value + "    ",

                           };


        foreach (var r in players)
        {              
            Console.WriteLine(r.Name + r.Goal);
        }

你希望按照什么方式进行排序? - PCG
1个回答

8
也许像这样:

也许像这样:

var players = 
    (from r in doc.Descendants("player")
     orderby int.Parse(r.Element("goals").Value) descending 
     select new
     {
         Name = r.Element("name").Value + "   ",
         Goal = r.Element("goals").Value + "    ",
     })
    .Take(3);

或者使用流畅的语法:

var players = doc.Descendants("player")
                 .OrderByDescending(r => int.Parse(r.Element("goals").Value))
                 .Select(r => new
                  {
                      Name = r.Element("name").Value + "   ",
                      Goal = r.Element("goals").Value + "    ",
                  })
                 .Take(3);

请注意,您需要将字符串值解析为整数才能获得正确的排序顺序。
要过滤结果,只需执行以下操作:
var players = 
    (from r in doc.Descendants("player")
     where r.Element("name").Value.StartsWith("David")
     orderby int.Parse(r.Element("goals").Value) descending 
     select new
     {
         Name = r.Element("name").Value + "   ",
         Goal = r.Element("goals").Value + "    ",
     })
    .Take(3);

或者使用流畅的语法:

var players = doc.Descendants("player")
                 .Where(r => r.Element("name").Value.StartsWith("David"))
                 .OrderByDescending(r => int.Parse(r.Element("goals").Value))
                 .Select(r => new
                  {
                      Name = r.Element("name").Value + "   ",
                      Goal = r.Element("goals").Value + "    ",
                  })
                 .Take(3);

谢谢,它有效! 在LINQ中是否可以有一个按名称搜索的功能。在SQL中 -> WHERE name LIKE 'David%'; - xterminal0
如果 order by 是一个日期字段呢? - Si8
@Si8 只需将 int.Parse 替换为 DateTime.ParseDateTime.ParseExact。请注意,如果您的日期格式类似于 yyyy-MM-ddTHH:mm:ss,则可能不需要解析它,因为组件已经排列好以支持字母排序。 - p.s.w.g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接