【问题标题】:Linq Razor Script to an A - Z Index [duplicate]到 A - Z 索引的 Linq Razor 脚本 [重复]
【发布时间】:2013-08-16 21:24:23
【问题描述】:

我一直在尝试找出创建脚本的最佳方法,该脚本类似于此页面上的职位列表:http://www.usi.edu/careersv/jobsearch.asp。我已经创建了数据库并填充了它,但我坚持使用最有效的方法来让我的信息以接近页面上的任何方式显示。我的理想外观是顶部的 A-Z 超链接,一旦用户单击一个字母,它就会在水平列表下方显示可用的内容。

这是我到目前为止所做的:

  @using admin.code.Database

    @{
       var car = new DatabaseEntities();
       var result = (from item in table.Lists                  
              orderby item.Name ascending 
              select item);

 foreach (var res in result)
{
   <div>
     <ul>
         <li><a href="@res.Link">@res.Name</a></li>
      </ul>
  </div>
}

}

我能否就更有效的前进方向获得一些建议?

【问题讨论】:

    标签: c# asp.net linq razor


    【解决方案1】:

    按第一个字母分组,然后循环显示该组。

    类似这样的东西:

    var result = table.Lists.OrderBy(x => x.Name).GroupBy(x => x.Name[0])
    

    显示:

    foreach(var res in result)
    {
        <a href="#@res.Key"></a>
    
        foreach(var item in res.Where(x => x[0] == res.Key){
            <div>
                 <ul>
                     <li><a href="@item.Link">@item.Name</a></li>
                  </ul>
              </div>
        }
    }
    

    确保您没有空字符串或在字符查找时处理这种情况。

    【讨论】:

      【解决方案2】:
      char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
      
      var car = new DatabaseEntities();
      var result = table.Lists.OrderBy(l=>l.Name); // For displaying them all
      var groups=result.GroupBy(l=>l.Substring(0,1)).OrderBy(l=>l.Key);
      var hasAlpha=groups.Select(l=>l.key);
      
      <ul>
      foreach(var letter in alpha)
      {
      if (hasAlpha.Contains(letter.toString())
      {
      <li>@letter.toString()</li>
      
      } else {
      <li><a href="#@letter.toString()">@letter.ToString()</a></li>
      }
      </ul>
      
      foreach(var group in groups)
      {
      <ul id="#@group.Key">
      foreach(var item in group)
      {
      <li>@item.Name</li>
      }
      </ul>
      }
      

      【讨论】:

      • 这应该转储所有字母,包括禁用的字母,然后还生成底部的东西,按第一个字母和超链接的目标分组。或者无论如何都非常接近。
      【解决方案3】:

      我将从键值(即:选项卡名称)开始并从那里构建查询:

      var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Cast<string>();
      
      var tabs =
        from letter in letters
        select new {
          Key = letter,
          Items =
            from item in tables.Lists
            where item.Name.StartsWith(letter, StringComparison.CurrentCultureIgnoreCase)
            select item
        };
      
      <ul id="navLinks">
      foreach (var tab in tabs) {
        <li>
          <a class="navLink" href="#@tab.Key">
            @tab.Key
          </a>
        </li>
      }
      </ul>
      
      <div id="items">
        foreach (var tab in tabs) {
          <ul id="@tab.Key" class="tab">
            foreach (var item in tab.Items) {
              <li class="tabItem">
                @item.Name
              </li>
            }
          </ul>
        }
      </div>
      

      【讨论】:

      • 免责声明:我更看重代码清晰度而不是性能。
      • 我可以举个加一个ul和li的例子吗?
      • @Paradigm:上面的(未经测试的)代码示例现在应该与 USI 页面非常匹配。
      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 2020-11-09
      • 2012-10-06
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多