Использование Array.Sort в индексаторе

262
09 сентября 2017, 23:25

Здравствуйте. У меня есть индексатор типа Array, объявленный в классе HomeLibrary. Как мне написать код в case 4, чтобы отсортировать массив объектов по полю "Author"? (лишние методы пропущены).

public class Book
{
    private string name;
    private string author;
    private string cathegory;
    private int year;
    private int index;
    public Book() { }
    public Book(int Inde, string Nam, string Autho, string Cathegor, int Yea)
    {
        this.Index = Inde;
        this.Name = Nam;
        this.Author = Autho;
        this.Cathegory = Cathegor;
        this.Year = Yea;
    }
    public int Index
    {
        get { return index; }
        set { index = value; }
    }
    public string Name
    {
        get { return name != null ? name : "Not set";}
        set { name = value;}
    }
    public string Author
    {
        get { return author != null ? author : "Not set"; }
        set { author = value; }
    }
    public string Cathegory
    {
        get { return cathegory != null ? cathegory : "Not set"; }
        set { cathegory = value; }
    }
    public int Year
    {
        get { return year; }
        set { year = (value > 2017 || value < 1) ? 0 : value; }
    }
    public override string ToString()
    {
        return index + "    " + name + "    " + author + "    " + cathegory + "    " + year + "    ".ToString();
    }
    public string poisk(string k)
    {
        if (name == k) return index + "    " + name + "    " + author + "    " + cathegory + "    " + year + "    ".ToString();
        else return null;
    }
}
public class HomeLibrary
{
    public Book this[int pos]
    {
        get
        {
            if (pos >= BookArr.Length || pos < 0)
                throw new IndexOutOfRangeException();
            else return (Book)BookArr.GetValue(pos);
        }
        set
        {
            BookArr.SetValue(value,pos);
        }
    }
    public Array BookArr;
    public HomeLibrary(int size)
    {
    BookArr = Array.CreateInstance(typeof(Book), size);
    }

    public string vala(int i)
    {
        return ((Book)BookArr.GetValue(i)).Author;
    }
}
class Program
{
    public static int Add(HomeLibrary hl, int l)
    {
        string na, au, ca;
        int ye;
        Console.WriteLine("Введите название книги.");
        na = Console.ReadLine();
        Console.WriteLine("Введите автора книги.");
        au = Console.ReadLine();
        Console.WriteLine("Введите жанр книги.");
        ca = Console.ReadLine();
        try
        {
            Console.WriteLine("Введите год издания книги.");
            ye = int.Parse(Console.ReadLine());
            hl.BookArr.SetValue(new Book(l, na, au, ca, ye), l);
            return l + 1;
        }
        catch (FormatException)
        {
            Console.WriteLine("Введен некорректный год.\n");
            return l;
        }
    }
    static void Main(string[] args)
    {
        HomeLibrary hl = new HomeLibrary(100);
        int wol, l = 1;
            bool j = true;
        while (j == true)
        {
            try
            {
                Console.WriteLine("\n Выберите интересующую опцию: \n 1: Добавить новую книгу. \n 2: Просмотр библиотеки. \n 3: Выполнить поиск книги. \n 4: Сортировка книг по... \n 5: Удалить книгу. \n 6: Выход.\n");
                wol = int.Parse(Console.ReadLine());
                switch (wol)
                {
                    case 1:
                    l = Add(hl, l);
                        break;
                    case 2:
                        vivod(hl, l);
                        break;
                    case 3:
                        search(hl, l);
                        break;
                    case 4:
                        break;
                    case 5:
                        BookDelete(hl, l);
                        break;
                    case 6:
                        j = false;
                        break;
                }
            }
            catch (FormatException)
            {
                Console.WriteLine("Введено не число.\n");
            }
        }
    }
}

}

Answer 1

Добавьте этот код вашему проекту. вообще-то у вас неправильно реализована. содержимое тип , приведение к типам , реализованы основные функции и так далее (неправильно).

public class SortByAuthor : IComparer
{
    public int Compare(object x, object y)
    {
        try
        {
            return authorCompare((Book)x, (Book)y);
        }
        catch (Exception Ex)
        {
            throw Ex;
        }
    }
    private int authorCompare(Book First, Book Second)
    {
        return StringComparer.Create(CultureInfo.DefaultThreadCurrentCulture,true).Compare(First.Author, Second.Author);
    }
}

Ну я вот реализовывал.

                switch (wol)
                {
                    case 1:
                        l = Add(hl, l);
                        break;
                    case 2:
                        vivod(hl, l);
                        break;
                    case 3:
                        search(hl, l);
                        break;
                    case 4:
                        Array.Sort(hl.BookArr, new SortByAuthor());
                        break;
                    case 5:
                        BookDelete(hl, l);
                        break;
                    case 6:
                        j = false;
                        break;
                }
READ ALSO
Как изменить fingerprint браузера

Как изменить fingerprint браузера

В программе используется CefSharpСтоит задача менять fingerprint браузера

459
Способы создания объектов в C#

Способы создания объектов в C#

Я знаю 1 способ создать объекта в C#:

354
После перезахода в сцену кнопка share не работает

После перезахода в сцену кнопка share не работает

Подскажите пожалуйста как решить проблему

235