【问题标题】:Looping through Xml data to output result循环Xml数据输出结果
【发布时间】:2012-09-23 00:06:30
【问题描述】:
var runnerElement = xDox.Descendants("User")
      .SingleOrDefault(u => u.Element("Name").Value == "David");

if (runnerElement != null)
{
    var result = runnerElement.Descendants("Runners")
      .Select(a => new
        {

            Date = DateTime.Parse(a.Element("Date").Value),
            MyLength = int.Parse(a.Element("Length").Value)
            City = a.Element("City").Value,
        })
      .Where(a => a.Date >= DateTime.Parse("3/29/2012")
                && a.Date <= DateTime.Parse("8/29/2012"))

      .GroupBy(a => a.City)
      .Select(g => new {City = g.Key, Avg = g.Average(x => x.MyLength)});
}

你将如何遍历这些数据,以便它可以给我这样的输出

User:David
Date:3/29/2012 to 8/29/2012
Average Distance in Paris : //Data
Average Distance in Madrid: //Data

我尝试进一步澄清我的代码..

【问题讨论】:

  • 您没有在查询中选择UserDate?你怎么得到那个?您是否要单独获取它们,然后您可以简单地在结果上使用 foreach 循环并显示它。

标签: c# linq xml-parsing linq-to-xml


【解决方案1】:

为了更正我之前的答案,它应该有一个方法,假设GetData带有相关输入,所以你可以使用StringBuilder来构建字符串:

public string GetData(string userName, DateTime fromDate, DateTime toDate)
{
     var userElement = xDox.Descendants("User")
            .SingleOrDefault(u => u.Element("Name").Value == userName);

    var builder = new StringBuilder();

    if (userElement != null)
    {
        var result = userElement.Descendants("Attempts")
            .Select(a => new
                {
                    Place = a.Element("Place").Value,
                    Date = DateTime.Parse(a.Element("Date").Value),
                    Distance = int.Parse(a.Element("Distance").Value)
                })

            .Where(a => a.Date >= fromDate
                        && a.Date <= toDate)

            .GroupBy(a => a.Place)
            .Select(g => new {Place = g.Key, Avg = g.Average(x => x.Distance)});

        builder.AppendFormat("User:{0}", userName);
        builder.AppendLine();

        builder.AppendFormat("Date:{0} to {1}", fromDate, toDate);
        builder.AppendLine();

        foreach (var item in result)
        {
            builder.AppendFormat("Average Distance in {0}: {1}", 
                                               item.Place, item .Avg);
            builder.AppendLine();
        }
    }

    return builder.ToString();
}

为了使用:

var fromDate = DateTime.Parse("8/30/2012");
var toDate = DateTime.Parse("10/1/2012");

string result = GetData("David", fromDate, toDate);

【讨论】:

  • 我收到此错误:当前上下文中不存在名称“r”
  • @IsraelRodriguez:我已经换了item,再检查一下
  • 对不起,愚蠢的问题,还有 GetData 有什么样的参数,我可以做这样的事情 GetData("David","8/30/2012","10/1/2012"
  • 如果我将它显示在列表框上,我可以做类似 mylistbox.Items.add(result) 的事情吗?
  • @IsraelRodriguez:谢谢,如果您将 TextBox 与 Multline 一起使用会更好
【解决方案2】:

好吧,您已经丢失了查询中的前两位信息(但无论如何它们都是硬编码的),但是对于“平均距离”位,它很简单:

foreach (var item in result)
{
    Console.WriteLine("Average Distance in {0}: {1}", item.Place, item.Avg);
}

这就是你所追求的吗?显然,您需要将其放在 if 块内,以便 result 在范围内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2017-04-29
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多