сортировка данных из MySQL в алфавитном порядке с использованием списка <string> и методов для возврата отсортированного списка в C #

0

Я извлекаю данные из файла базы данных MySQL и загружаю оттуда три элемента данных в метод, называемый index, который извлекает поля Name, фамилия и номер телефона..... Основная цель - загрузить все данные в алфавитном порядке по фамилии Letter и если совпадают две фамилии, он должен отсортировать их в алфавитном порядке имен.

using Data_Layer;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace Business_Logic_Layer
{
    public class BusinessLogic
    {
        public List<PhoneIndex> phoneIndex = new List<PhoneIndex>();

        public void createPhoneIndex()
        {
            string tableName = "customers";

            DataConnection dc = new DataConnection();
            DataSet customers = dc.selectData(tableName);

            foreach (DataRow customer_row in customers.Tables[0].Rows)
            {
                string surname, name, telephone;
                surname = name = telephone = "";

                for (int i = 0; i < customers.Tables[0].Columns.Count; i++)
                {
                    if (customers.Tables[0].Columns[i].ColumnName.StartsWith("contactFirstName"))
                    {
                        name = customer_row.ItemArray[i].ToString();
                    }
                    else if (customers.Tables[0].Columns[i].ColumnName.StartsWith("contactLastName"))
                    {
                        surname = customer_row.ItemArray[i].ToString();
                    }
                    else if (customers.Tables[0].Columns[i].ColumnName.StartsWith("phone"))
                    {
                        telephone = customer_row.ItemArray[i].ToString();
                    }
                }

                // Add the information to the main phoneIndex

                bool added = false;

                PhoneIndexEntry temp_index_entry = new PhoneIndexEntry() { name = name, surname = surname, telephone = telephone };

                for (int i = 0; i < phoneIndex.Count; i++)
                {
                    if (surname.StartsWith(phoneIndex[i].letter))
                    {
                        phoneIndex[i].entries.Add(temp_index_entry);
                        added = true;
                    }
                }

                if (!added)
                {
                    PhoneIndex temp_index = new PhoneIndex() { letter = surname.Substring(0, 1), entries = new List<PhoneIndexEntry>() { temp_index_entry } };
                    phoneIndex.Add(temp_index);
                    added = true;
                }

            }
        } // End of method createPhoneIndex()




        public void sortPhoneIndex()
        {


            // Your code goes here...
            string surname, name;
            surname = name = "";
            List<PhoneIndex> phoneIndex = new List<PhoneIndex>() { };

            PhoneIndexEntry temp_index_entry = new PhoneIndexEntry() { name = name, surname = surname };

            foreach (PhoneIndex index in phoneIndex)//letter, entries sort through letters
            { 

                            string[] sortedLetter = new string[1];

                            for (int i = 0; i < phoneIndex.Count - 1; i++)
                            {
                                for (int j = i + 1; j < phoneIndex.Count; j++)
                                {
                                    if (phoneIndex[i].letter.CompareTo(phoneIndex[j].letter) > 0)
                                    {
                                        sortedLetter[0] = phoneIndex[i].letter;
                                        phoneIndex[i].letter = phoneIndex[j].letter;
                                        phoneIndex[j].letter = sortedLetter[0];
                                    }
                                }
                            }
                //if name==name compare surname for sorting
                return;
                        }

                    }//end of foreach

                } // End of method sortPhoneIndex()

        } // End of Class BusinessLogic



        public class PhoneIndex
        {
            public string letter { get; set; }
            public List<PhoneIndexEntry> entries { get; set; }


        } // End of Class PhoneIndex

        public class PhoneIndexEntry
        {
            public string name { get; set; }
            public string surname { get; set; }
            public string telephone { get; set; }

        } // End of Class PhoneIndexEntry


// End of Namespace Business_Logic_Layer

A =

Энтони, Адамс, 0670510248

B = счет, Адамс, 0724677987 счет, тигель, 0687944987

  • 0
    Индекс телефонного кода работает, однако весь метод sortPhoneIndex не работает и это то, что мне нужно для работы, любая помощь или предложения будут полезны.
  • 1
    Знаете ли вы, что вы можете сортировать данные с помощью SQL (ORDER BY)? Сортировка по телефону несколько бессмысленна.
Показать ещё 1 комментарий
Теги:
sorting
alphabetical-sort

1 ответ

0

Если предположить, что вы не можете изменить способ извлечения данных из базы данных, то это работа, в которой Linq может очень помочь упростить ваш код.

// Example data .....
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("surname", typeof(string));
dt.Columns.Add("phone", typeof(string));
dt.Rows.Add("charles", "dickens", "11232");
dt.Rows.Add("mark", "twain", "453446");
dt.Rows.Add("howard", "lovecraft", "875564");
dt.Rows.Add("ernst", "hemingway", "1647567");
dt.Rows.Add("thomas", "mann", "56434");
dt.Rows.Add("isaac", "asimov", "9700");
dt.Rows.Add("aldous", "huxley", "2654");


List<PhoneIndex> phoneIndex = new List<PhoneIndex>();

// Let enumerate the datatable grouping by first letter in the surname column
var names = dt.AsEnumerable().GroupBy(d => d.Field<string>("surname").Substring(0, 1))
         // foreach group build a sublist with the info from the datarow 
         // transformed in a PhoneIndexEntry.
         .Select(g => g.Select(p => new PhoneIndexEntry 
         {
             name = p.Field<string>("name"),
             surname = p.Field<string>("surname"),
             telephone = p.Field<string>("phone")

         }));

// Now we have an IEnumerable<IEnumerable> where the first enumerable is a list 
// of all distinct first letter from the surname column, while the second
// is an enumerable of PhoneIndexEntry. 
// We can loop over the first Enumerable ordering it
// by the first surname letter and creating a PhoneIndex with all the PhoneIndexEntry for that specific letter
foreach (var entry in names.OrderBy(n => n.First().surname[0].ToString()))
    phoneIndex.Add(new PhoneIndex { letter = entry.First().surname[0].ToString(), entries = entry.OrderBy(s => s.surname).ToList()});

Примечание: похоже, у вас очень плохой метод do_it_all (SelectData), в котором вы передаете имя таблицы и получаете все данные из этой таблицы.
Конечно, это не хороший способ сделать запрос к базе данных, и, если вы не получите очень мало записей, я предлагаю вам написать конкретные методы для каждого извлечения данных или посвятить немного времени изучению того, как использовать библиотеку ORM.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню