Ищу класс, который позволяет пользовательский метод сортировки - PullRequest
1 голос
/ 13 апреля 2009

Я написал небольшое приложение, которое позволяет мне сравнивать две схемы базы данных, чтобы проверить различия в структуре. Все идет вплоть до деталей колонки, что приятно. Когда я сравнивал очень маленькие базы данных, у меня не было никаких проблем, но когда я начинаю сравнивать базы данных с сотнями таблиц, раздражает прокрутка вверх и вниз, чтобы найти ошибки. Первоначально я использовал KeyedCollection для хранения списка таблицы, но, поскольку он не допускает какой-либо сортировки, с тех пор я перешел на SortedList. SortedList сортирует индексы, что дает мне таблицы в алфавитном порядке, но это меньше, чем мне нужно. Что мне нужно, это класс, который позволяет мне сортировать на основе свойств объекта, а не только по значениям индекса. Я хочу перенести таблицы с ошибками в начало списка для удобства использования. У кого-нибудь есть идея, какой класс я мог бы использовать для достижения этой цели?

EDIT1: у класса List нет индекса, что очень важно для моего класса. Я попытался использовать словарь, который имеет индекс, но не имеет метода сортировки. Реализация IComparer не работает, потому что конструктор принимает только IComparer типа индекса. И поскольку IComparer - это другой класс, который не имеет доступа к внутреннему списку значений моего класса списка, я не могу сравнивать его по свойствам объекта.

EDIT2: мне нужен класс, который сортирует индекс по свойствам объекта, а не по значениям индекса, но я начинаю верить, что такого класса не существует.

Ответы [ 4 ]

2 голосов
/ 13 апреля 2009

Затем вам нужно создать класс для реализовать : System.Collections.Generic.IComparer , затем вы можете поместить все свои объекты в коллекцию, которая поддерживает сортировку на основе IComparer, для пример:

System.Collections.Generic.List позволит вам сортировать на основе вашей собственной реализации.

Вот ссылка на хороший пример, чтобы помочь вам понять это.

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

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

0 голосов
/ 14 апреля 2009

Если все, что вы пытаетесь сделать, это создать собственную сортировку, то это может быть самым простым:

List<Foo> myFoos = new List<Foo>();
//--Write code to fill the list

//sort by ID
myFoos.Sort(delegate(Foo foo1, Foo foo2)
{
    return foo1.ID.CompareTo(foo2.ID);
});

//Sort by Last Name
myFoos.Sort(delegate(Foo foo1, Foo foo2)
{
    return foo1.LastName.CompareTo(foo2.LastName);
});

Если вы не хотите использовать анонимные методы и хотите иметь одинаковый тип сортировки в нескольких местах, вы также можете сделать это:

public class FooIDCompare : IComparer<Foo>
    {
        #region IComparer<foo> Members

        public int Compare(Foo x, Foo y)
        {
            return x.ID.CompareTo(y.ID);
        }

        #endregion
    }

FooIDCompare idCompare = new FooIDCompare();
myFoos.Sort(idCompare);
0 голосов
/ 13 апреля 2009

Создайте SortedList с использованием перегруженного конструктора this с пользовательским классом IComparer , который вы реализуете для сортировки по своему усмотрению.

...