【问题标题】:How can I get value from KeyValuePair Values如何从 KeyValuePair Values 中获取价值
【发布时间】:2016-04-09 09:49:26
【问题描述】:

我必须建立一个包含上课时间、星期几和课程的健身房时间表,所以我从数据库中得到的是:

时间 - 星期几 - 课程
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 的经验。如果有人能建议我需要做什么,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: c# asp.net-mvc keyvaluepair


    【解决方案1】:

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

    在更好地理解问题后进行编辑:

    您的问题有两个方面。

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

    如果我是你,我会摆脱 Group 类,因为它不再需要。 Dictionary 会更好地满足您的需求。我会将您的模型设置为Dictionary&lt;DateTime, List&lt;Aulas&gt;&gt;

    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 添加到 Dictionary 中的现有条目中。这样,当我在视图中遍历它们时,我正在按 DateTime 循环。然后对于每个列 (&lt;td&gt;),我在 .Value 上执行一个 Where 子句,这将是一个 List&lt;Aulas&gt; 和一个 Select 查询以获取我想要的数据类型。它将拉出所有具有特定 idDias 的 Aula,并使用 String.Join() 方法加入它们。

    【讨论】:

    • 感谢您的评论。我已经看过这个 MSDN,但正如我所写的,我没有使用密钥对的经验,也不知道如何解决这个问题。你能帮帮我吗?
    • @Rodney 您的 KeyValuePair 是哪个变量?
    • 对不起,我不明白你的要求。
    • @Rodney 您的问题是关于 KeyValuePair 以及如何获得 KeyValuePair 的值。好吧,我说过有一个 .Value 属性可以用来获取值。然后你说你不知道如何解决问题。从您的代码中,使用 KeyValuePair 集合的问题并不明显。因此,使用上面的代码, KeyValuePair 集合在哪里,您的问题在哪里?如果您提供更多信息,我会更新我的答案以提供帮助。
    • 首先,感谢您的帮助。事实上,我有两个问题需要帮助,首先是构建该网格,如果 KeyValuePair 是获得该网格的最佳或可能的方法。查看图片以获得更好的理解......我期待这个(efeitodigital.com.br/right.gif)并且我得到了这个(efeitodigital.com.br/wrong.gif)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2018-04-07
    • 2021-12-26
    • 1970-01-01
    • 2016-08-24
    • 2012-11-29
    • 2018-08-20
    相关资源
    最近更新 更多