2009-05-30 4 views
2

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

, как показано на 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); 

В результате моего код Я вижу пропущенные буквы 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> 
    <%} %> 

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

ответ

4

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

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

Возможно, это не так. Я только что сделал это в «Блокноте» (сейчас у меня нет доступа к 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); 
} 

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

+0

Да, я обновил сообщение и включил код, который относится к рендерингу Но все же проблематично создать разделение по столбцам. Я посмотрел ближе к коду, который * Jon Skeet * отправлен, и это не помогает в финале Я сделал все это * goto's * просто для разделения. Как создать список с письмами и услугами, которые я знаю ... – omoto

Смежные вопросы