如何从 KeyValuePair 值中获取值

How can I get value from KeyValuePair Values

我必须用 class 时间、星期几和 classes 建立一个健身房时间表,所以我从数据库中得到的是:

时间 - 星期几 - class
08:00 - 1 - Natação
08:00 - 3 - Natação
08:30 - 1 - 柔术
09:00 - 1 - Natação
10:30 - 1 - 柔术
14:00 - 3 - Natação

我的模特:

 public class Group<K, T>
{
    public K Key;
    public IEnumerable<T> Values;
}

public class Aulas
{
    public int id { get; set; }
    public int idDias { get; set; }
    public DateTime AulaHora { get; set; }
    public string AulaNome { get; set; }

}

我的控制器

 public ActionResult Index()
    {
        Context _q = new Context();

       var query = from x in _q.Aulas
                   group x by x.AulaHora into g
                   select new Group<DateTime, Aulas> { Key = g.Key, Values = g };


        return View(query.ToList());
    }

我的看法:

@using Grid.Models;
@model List<Group<DateTime, Aulas>>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<table class="table table-striped">
    <thead><tr><th>Horários</th><th>Segunda</th><th>Terça</th><th>Quarta</th><th>Quinta</th><th>Sexta</th><th>Sábado</th></tr></thead>
        @foreach (var item in Model)
        {       
            <tr>
                @foreach (var i in item.Values)
                {
                <td>@i.AulaHora.ToString("HH:mm")</td>
                <td>@((i.idDias == 1) ? i.AulaNome.ToString() : "")</td>
                <td>@((i.idDias == 2) ? i.AulaNome.ToString() : "")</td>
                <td>@((i.idDias == 3) ? i.AulaNome.ToString() : "")</td>
                <td>@((i.idDias == 4) ? i.AulaNome.ToString() : "")</td>
                <td>@((i.idDias == 5) ? i.AulaNome.ToString() : "")</td>
                <td>@((i.idDias == 6) ? i.AulaNome.ToString() : "")</td>
                }
            </tr>
        }
</table>

很遗憾,我没有使用 KeyValuePair 的经验。如果有人能建议我需要做什么,我将不胜感激。

提前致谢。

每个 KeyValuePair 将包含一个 .Value 属性,它将为您提供值。请参阅此 MSDN https://msdn.microsoft.com/en-us/library/ms224761(v=vs.110).aspx

更好地理解问题后编辑:

您的问题有两个方面。

  1. 首先,您针对所需输出的类型构建了错误的查询。
  2. 其次,您在视图中循环查询是错误的,无法按您的意愿显示。

如果我是你,我会摆脱那个 Group class,因为它不再需要了。 Dictionary 更适合您的需要。我会将您的模型设置为 Dictionary<DateTime, List<Aulas>>.

Dictionary<DateTime, List<Aulas>> query = 
    new Dictionary<DateTime, List<Aulas>>();

_c.Aulas.ForEach(
    (a) =>
    {
        if (query.ContainsKey(a.AulaHora))
        {
            query[a.AulaHora].Add(a);
        }
        else
        {
            query.Add(a.AulaHora, new List<Aulas>() { a });
        }
    });

return View(query);

然后您将需要以不同的方式遍历它们以获得您想要的结果。

@using Grid.Models;
@model Dictionary<DateTime, List<Aulas>>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<table class="table table-striped">
    <thead><tr><th>Horários</th><th>Segunda</th><th>Terça</th><th>Quarta</th><th>Quinta</th><th>Sexta</th><th>Sábado</th></tr></thead>
        @foreach (var item in Model)
        {       
            <tr>
            <td>@(item.Key.ToString("HH:mm"))</td>
            <td>@(string.Join(", ", item.Value.Where((wa) => wa.idDias == 1).Select((sa) => sa.AulaNome)))</td>
            <td>@(string.Join(", ", item.Value.Where((wa) => wa.idDias == 2).Select((sa) => sa.AulaNome)))</td>
            <td>@(string.Join(", ", item.Value.Where((wa) => wa.idDias == 3).Select((sa) => sa.AulaNome)))</td>
            <td>@(string.Join(", ", item.Value.Where((wa) => wa.idDias == 4).Select((sa) => sa.AulaNome)))</td>
            <td>@(string.Join(", ", item.Value.Where((wa) => wa.idDias == 5).Select((sa) => sa.AulaNome)))</td>
            <td>@(string.Join(", ", item.Value.Where((wa) => wa.idDias == 6).Select((sa) => sa.AulaNome)))</td>
            </tr>
        }
</table>

只是几件事。我正在根据 Aulas 的 DateTime 创建字典。如果有匹配的 DateTime 键,那么我将 Aulas 添加到字典中的现有条目中。这样,当我在视图中循环遍历它们时,我将按 DateTime 循环。然后对于每一列 (<td>),我在 .Value 上执行一个 Where 子句,这将是一个 List<Aulas> 和一个 Select 查询以获取我想要的数据类型。它将拉出所有具有该特定 idDias 的 Aulas 并使用 String.Join() 方法加入它们。