【问题标题】:How to create Alphabetical list with letters?如何用字母创建按字母顺序排列的列表?
【发布时间】:2009-05-30 09:21:45
【问题描述】:

大家好,我正在尝试按列实现 alpha 有序列表

picture所示

但我的算法不清楚,也许有人可以帮助我

string[] letters = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I",
  "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
  "Y", "Z", "Å", "Ä", "Ö", "0-9" };

int j = 0, s = 0, i = 1;
var fullServices = (from se in EntityBase.db.Services
               orderby se.Name
               select se).ToList();
int total = fullServices.Count;
var grouped = (from l in letters
            select new ServiceInfo
            {
              Letter = l,
              Services = EntityBase.db.Services.Where(se => se.Name.StartsWith(l)).ToList(),
              Total = EntityBase.db.Services.Where(se => se.Name.StartsWith(l)).Count()
            }).ToList();
Dictionary<int, List<ServiceInfo>> result = new Dictionary<int, List<ServiceInfo>>();

changecell:

List<ServiceInfo> item = new List<ServiceInfo>();
while (j < letters.Count())
{
letterchange:
   List<Service> _services = new List<Service>();
   while (s < total)
   {
      if ((s == (5 + (total % 5 > i ? 1 : 0)) * i))
      {
         item.Add(new ServiceInfo() { Letter = letters[j], Services = _services });
         result.Add(i, item);
         if (i == 6)
            goto exit;
         i++;
         goto changecell;
      }
      //start render services
      if (fullServices.ElementAt(s).Name.StartsWith(letters[j]))
      {
         _services.Add(fullServices.ElementAt(s));
         s++;//increment service in list
      }
      else //letter switch
      {
         item.Add(new ServiceInfo() { Letter = letters[j], Services = _services });
         j++;
         goto letterchange;
      }
   }//end render services

}
exit:
return View(result);

在我的代码结果中,我看到丢失的字母 X Y Z Å Ä Ö 它看起来像this

这里是呈现字典的代码

<% foreach (KeyValuePair<int, List<BL.Models.Infos.ServiceInfo>> col in Model)
{ %>
  <ul class="col">
    <% foreach (var item in col.Value)
 { %>
    <% if (!item.Services.Any())
 {%>
    <li class="disabled">
      <h1>
        <%= item.Letter %></h1>
    </li>
    <%}
 else
 { %>
    <li>
      <h1>
        <a href="/service/info/<%= item.Letter %>"><%= item.Letter %></a>
      </h1>
    </li>
    <% foreach (var service in item.Services)
 { %>
    <li><a href="/service/info/<%= service.Name %>"><%= service.Name %></a></li>
    <%}
 }
 }%>
  </ul>
  <%} %>

请帮忙...

【问题讨论】:

    标签: c# asp.net-mvc algorithm logic


    【解决方案1】:

    好吧,你说得对,代码不是特别清楚 :)

    我并没有真正遵循您代码的主循环,但这里有一个更简单的起点。请注意,它不会正确地将 0-9 分组(它目前只处理 0):老实说,我不确定解决这个问题的最佳方法。你可能想推迟它,直到你得到一些与任何正常字母都不匹配的条目......

    using System;
    using System.Linq;
    
    class Test
    {   
        static void Main(string[] args)
        {
            ShowGroups();
        }
    
        private static readonly char[] Letters = 
            "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ0".ToCharArray();
    
        // This is taking the place of EntityBase.db.Services
        // for the purposes of the test program
        public static string[] Services = { "Blogger", "Delicious", 
                "Digg", "Ebay", "Facebook", "Feed", "Flickr", 
                "Friendfeed", "Friendster", "Furl", "Google", 
                "Gosupermodel", "Lastfm", "Linkedin", "Livejournal",
                "Magnolia", "Mixx", "Myspace", "NetOnBuy", "Netvibes",
                "Newsvine", "Picasa", "Pownce", "Reddit", "Stumbleupon",
                "Technorati", "Twitter", "Vimeo", "Webshots", 
                "Wordpress" };
    
        public static void ShowGroups()
        {
            var groupedByLetter = 
                from letter in Letters
                join service in Services on letter equals service[0] into grouped
                select new { Letter = letter, Services = grouped };
    
            // Demo of how to access the groups
            foreach (var entry in groupedByLetter)
            {
                Console.WriteLine("=== {0} ===", entry.Letter);
                foreach (var service in entry.Services)
                {
                    Console.WriteLine ("  {0}", service);
                }
                Console.WriteLine();
            }
        }
    }
    

    我不知道您打算如何将结果分成 5 个相等的列...

    【讨论】:

      【解决方案2】:

      这可能不太对劲 - 我刚刚在记事本中完成了这项工作(目前无法访问 IDE)。看起来您正在尝试填充 Dictionary&lt;int, List&lt;ServiceInfo&gt;&gt; result 实例,我假设您的 View 方法了解如何在列中布局结果。

      这里是:

      string[] letters = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
                                        "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
                                        "U", "V", "W", "X", "Y", "Z", "Å", "Ä", "Ö", "0-9" };
      
      var result = new Dictionary<int, List<ServiceInfo>>();
      foreach (var letter in letters)
      {
          var services = (from se in EntityBase.db.Services
                          where se.Name.StartsWith(letter)
                          orderby se.Name
                          select select new ServiceInfo
                          {
                              Letter = letter,
                              Services = EntityBase.db.Services.Where(se => se.Name.StartsWith(letter)).ToList(),
                              Total = EntityBase.db.Services.Where(se => se.Name.StartsWith(letter)).Count()
                          }).ToList();
          result.Add(i, services);
      }
      

      如果它是正确的,它可能不会是最快的实现,但它更具可读性。

      【讨论】:

      • 是的,我已经更新了帖子并包含了属于 render 的代码但是仍然存在按列创建分隔的问题 我看起来更接近 Jon Skeet 发布的代码,但它没有t 帮助最后我做了所有这些 goto's 只是为了分离。我知道如何在下面创建带有信件和服务的列表...
      猜你喜欢
      • 2022-06-24
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      相关资源
      最近更新 更多