如何用字母创建按字母顺序排列的列表?

发布于 2024-07-22 04:34:08 字数 2859 浏览 1 评论 0 原文

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

图片

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

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);

我的代码结果中,我看到丢失的字母 XYZ Å ä Ö 它看起来像 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>
  <%} %>

请帮忙。 ..

Hi all I trying to implement alpha ordered list by columns

as shown on picture

But my algorithm is not clear and maybe someone could help me within

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);

In a result of my code I see missed letters X Y Z Å Ä Ö
and it's looks like this

Here comes code that renders dictionary

<% 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>
  <%} %>

Please help...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

豆芽 2024-07-29 04:34:08

好吧,你肯定是对的,代码不是特别清晰:)

我并没有真正遵循你的代码的主循环,但这里有一个更简单的起点。 请注意,它不会正确地将 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 个相等的列...

Well, you're certainly right that the code's not particularly clear :)

I don't really follow the main loop of your code, but here's a simpler starting point. Note that it won't group 0-9 properly (it only deals with 0 at the moment): I'm not sure the best way to approach that, to be honest. You might want to put that off until you get some entries which don't match any of the normal letters...

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();
        }
    }
}

I don't know how you intend to split the results into 5 equal columns though...

記柔刀 2024-07-29 04:34:08

这可能还很遥远 - 我刚刚在记事本中完成了此操作(现在无法访问 IDE)。 看起来您正在尝试填充 Dictionary> 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);
}

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

This might be way off - I've just done this in Notepad (don't have access to an IDE right now). It looks like you're trying to populate the Dictionary<int, List<ServiceInfo>> result instance and I'm assuming that your View method understands how to layout the results in columns.

Here goes:

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);
}

If it's correct, it probably won't be the fastest implementation, but it's more readable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文