Как создать алфавитный список с буквами? - PullRequest
2 голосов
/ 30 мая 2009

Привет всем, я пытаюсь реализовать альфа-упорядоченный список по столбцам

как показано на картинке

Но мой алгоритм неясен, и, возможно, кто-то может помочь мне в

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 Å Ä Ö и это выглядит как это

Вот код, который отображает словарь

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

Пожалуйста, помогите ...

Ответы [ 2 ]

4 голосов
/ 30 мая 2009

Ну, вы, конечно, правы, что код не совсем понятен:)

Я действительно не следую основному циклу вашего кода, но вот более простая отправная точка. Обратите внимание, что он не будет группировать 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 равных столбцов ...

0 голосов
/ 30 мая 2009

Это может быть далеко - я только что сделал это в Блокноте (сейчас у меня нет доступа к IDE). Похоже, вы пытаетесь заполнить экземпляр Dictionary<int, List<ServiceInfo>> 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);
}

Если это правильно, вероятно, это будет не самая быстрая реализация, но она более читаема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...