Как я могу ограничить типы параметров для использования компаратора меньше, чем для данных? - PullRequest
0 голосов
/ 30 марта 2020

Мне нужно отсортировать данные, которые я использую в основной функции. Как я могу ограничить типы параметров для использования компаратора меньше, чем для упорядочивания чисел?

Вот инструкции, которые у меня есть для кода:

В этом назначении вы будете реализовывать generi c заказал класс SortedLinkedList на основе класса c LinkedList вашего проекта. Использование фреймворка или сторонних пакетов запрещено. Вы можете использовать наследование или композицию в своей реализации. Класс должен поддерживать один метод Add, который принимает один параметр generi c, как показано в подписи ниже. Этот параметр будет вставлен в список в правильной последовательности (словарный порядок, без учета регистра). publi c void Add (T element)

В методе вставки необходимо обработать четыре условия:
1. Список пуст
2. Новый элемент меньше, чем первый элемент
3. Новый элемент больше, чем последний элемент
4. Новый элемент больше, чем первый элемент и меньше, чем последний элемент

Продемонстрируйте, что ваш класс функционален, создав упорядоченный список целых чисел, добавление тестовых данных (приведенных ниже) и итерация по списку для отображения содержимого списка (в порядке узлов). Целочисленные данные: 7, 6, 10, 15, 4, 0, 10, -5, 3, 11, 6, 3, 0, 1 и 8

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inheritance_SortedLinkedList_Generics
{
    class Program
    {
        static void Main(string[] args)
        {
            SortedDoublyLinkedList<int> List = new SortedDoublyLinkedList<int>();

            List.Add(7);
            List.Add(6);
            List.Add(10);
            List.Add(15);
            List.Add(4);
            List.Add(0);
            List.Add(10);
            List.Add(-5);
            List.Add(3);
            List.Add(11);
            List.Add(6);
            List.Add(3);
            List.Add(0);
            List.Add(1);
            List.Add(8);

            List.Print();

            Console.ReadKey();
        }
    }
}

public class SortedDoublyLinkedList<T> : LinkedList<T> where T : struct
{
    public void Add(T element) 
    {   //if the list is empty
        if(head == null)
        {   //allocates memory for the first node 
            //head and tail point to the one and only node
            head = new Node<T>(element);
            tail = head;
        }
        else
        {   //new node becomes new head of list
            var oldHead = head;

            //head now points to new node containing data
            head = new Node<T>(element);
            head.next = oldHead;

            oldHead.previous = head;
        }
    }
    //prints the elements of the list
    public void Print()
    {
        if (head != null)
        {
            head.Print();
        }  
    }

    //default constructor for creating the list
    public SortedDoublyLinkedList()
    {
        head = null;
        tail = null;
    }

    public Node<T> head { get; set; }
    public Node<T> tail { get; set; }
}

public class Node<T>
{
    public T data { get; set; }
    public Node<T> next { get; set; }
    public Node<T> previous { get; set; }

    public Node(T i)
    {
        data = i;
        next = null;
        previous = null;
    }

    public void Print()
    {
        Console.Write("<-|" + data + "|->");

        if(next != null)
        {
            next.Print();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вы хотите ограничить тип для реализации IComparable<T>.

public class SortedDoublyLinkedList<T> : LinkedList<T> where T : struct, IComparable<T>
{


}
0 голосов
/ 30 марта 2020

Вы не можете ограничить тип так, что, к сожалению, определен оператор c (меньше чем). Вместо этого вы должны реализовать Comparer (см. эту ссылку ). В конце концов, если у вас есть действительно обобщенный c отсортированный список, тип может быть любым, и поэтому значение «меньше чем» не может быть указано в обобщенном c виде. Однако дело усложняется тем фактом, что присваивание запрашивает «порядок словаря, без учета регистра», который может применяться только к строкам или объектам, которые могут быть преобразованы в строки. Поэтому, возможно, вы могли бы вызвать element.ToString (). ToLower () и отсортировать по алфавиту, однако сортировки по алфавиту не будут работать для целых чисел («7» означает> «10»). На самом деле мне кажется, что этот вопрос некорректен, и вы должны попросить разъяснений.

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