альтернатива циклу foreach для c # для получения элементов из списка - PullRequest
0 голосов
/ 21 сентября 2018

Я надеюсь, что кто-то может здесь помочь, что должно быть простой проблемой.Я искал ответ, но думаю, что отчасти проблема в том, что я не совсем понимаю, о чем спрашиваю.У меня есть следующий код.

@using System;
@using System.Collections.Generic;
@using System.Linq;
@using System.Xml.Linq;

<div>
@{ 
  String URLString = "https://api3.libcal.com/api_hours_grid.php?iid=4246&  format=xml&weeks=1&systemTime=0";
  XDocument xdoc = new XDocument();
  xdoc = XDocument.Load(URLString);


  var location = (from p in xdoc.Descendants("location")
                  from s in p.Descendants("week").Elements()
                  select new
                  {                  
                      CampusName = (string)p.Element("name"),
                      WeekD = (string)s.Element("date")
                  }).ToList();


                  foreach (var item in location)

                  {
                     foreach (var item in location)
                     {
                     <p>@item.WeekD</p>
                     }

                    <h2>@item.CampusName</h2>

                  }
}

</div>

Очевидно, что вложенный цикл foreach вызывает ошибку.Я пытаюсь добиться чего-то вроде следующего:

<h2>Campus Name</h2>
<p>date</p>
<p>date</p>

<h2>Campus Name</h2>
<p>date</p>
<p>date</p>

и т. Д. Может ли кто-нибудь дать совет, как мне получить этот результат?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вы можете попробовать GroupBy ваш CampusName и затем спроецировать свой результат на ToDictionary как

@using System;
@using System.Collections.Generic;
@using System.Linq;
@using System.Xml.Linq;

<div>
    @{
        String URLString = "https://api3.libcal.com/api_hours_grid.php?iid=4246&  format=xml&weeks=1&systemTime=0";
        XDocument xdoc = new XDocument();
        xdoc = XDocument.Load(URLString);


        var location = (from p in xdoc.Descendants("location")
                        from s in p.Descendants("week").Elements()
                        select new
                        {
                            CampusName = (string)p.Element("name"),
                            WeekD = (string)s.Element("date")
                        }).ToList();


        var result = location.GroupBy(x => x.CampusName)
               .ToDictionary(grp => grp.Key, grp => grp.Select(x => x.WeekD));


        foreach (var item in result)
        {
            <h2>@item.Key</h2>
            foreach (var innerItem in item.Value)
            {
                <p>@innerItem</p>
            }
        }
    }

</div>

Вывод: Вывод содержит 6 строк названия местоположения, но здесьЯ показываю только 2 для простоты

enter image description here

0 голосов
/ 21 сентября 2018

Я сделал код для вас.Попробуй!

    string URLString = "https://api3.libcal.com/api_hours_grid.php?iid=4246&%20format=xml&weeks=1&systemTime=0";
    XDocument xdoc = XDocument.Load(URLString );

    foreach (var element in xdoc.Descendants("location"))
    {
        var temp = element.Descendants("name");
        string name = "";
        if (temp.Count() != 0)
            name = temp.ToList()[0].Value;
        <h2>@name</h2>
        foreach (var d in element.Descendants("date"))
        {
            var date = d.Value;
            <p>date</p>
        }
    }
0 голосов
/ 21 сентября 2018

(код Psuedo)

string currentLocation = "";

foreach (var item in location)
{
   if(@item.CampusName != currentLocation)
   {
      <h2>@item.CampusName</h2>
      currentLocation = @item.CampusName;
   }
   <p>@item.WeekD</p>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...