0
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

私は自分のコードをもう少し明確にしようとしています..

4

2 に答える 2

1

クエリの最初の 2 ビットの情報が失われました (ただし、とにかくハードコーディングされています)。しかし、「平均距離」ビットについては、次のように簡単です。

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

あなたが求めているのはそれだけですか?if明らかに、それが範囲内にあるようにブロック内にある必要がありresultます。

于 2012-10-02T06:01:54.413 に答える
0

私の以前の答えを修正するには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);
于 2012-10-02T06:11:29.673 に答える