Сортировка С# (sharp) Не сортирует

170
12 марта 2018, 23:44

Делаю сортировку. Но почему-то не сортирует, задача сделать сортировку по алфавиту, а если буквы одинаковы то по весу. Прошу помощи, не могу понять почему не хочет сортировать. Вот код. Пишу в MVS.

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
    public class Detal : IComparable, IComparer
    {
        string name;
        double vaga;
        public Detal()
        {
            name = "NoName";
            vaga = 0;
        }
        public Detal(string namee, double v)
        {
            name = namee;
            vaga = v;
        }
        public void Output()
        {
            Console.WriteLine("Name is {0} || vaga ={1}", name, vaga);
        }
        public int Compare(Object x0, Object y0)
        {
            Detal x = (Detal)x0;
            Detal y = (Detal)y0;
            if (String.Compare(x.name, y.name) < 0)
            {
                return -1;
            }
            else if (String.Compare(x.name, y.name) == 0)
            {
                if (x.vaga < y.vaga)
                { return 0; }
                else
                {
                    if (x.vaga == y.vaga)
                    { return 0; }
                    else
                    { return 1; }
                }
                }
            else
            {
                return 1;
            }
        }
        public int CompareTo(Object x)
        {
            return Compare(this, x);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("\nСписок деталей до сортування:");
            ArrayList x = new ArrayList
            {
                new Detal("Gaika", 0.5),
                new Detal("Rama", 400),
                new Detal("Korpus", 660),
                new Detal("Bumper", 15),
                new Detal("Molotok", 1.5),
                new Detal("Koleso", 1.1)
            };
            Detal st = new Detal();
            for (int i = 0; i < x.Count; i++)
            {
                st = (Detal)x[i];
                st.Output();
            }
        }
    }
}
Answer 1

Проблема в этом месте:

if (x.vaga < y.vaga)
{ return 0; }

Этот код делает вашу функцию сравнения неантисимметричной. Допустим, x.name == y.name, и x.vaga > y.vaga. Тогда если сравнивать x с y, получим, что они равны. А если сравнивать y с x, получим, что нет.

Answer 2

Непосредственно за сортировку отвечает интерфейс IComparable. Т.е. чтобы компоратор ("сравниватель") знал, как объект нужно сравнивать с другими такими же нужно реализовать метод

public int CompareTo(object obj)
        {
            return ...
        }

Документация по интерфейсу IComparable

В вашем примере, внутри класса я бы предложил следующую реализацию метода CompareTo(). А интерфейс IComparer и его метод public int Compare(Object x0, Object y0) вам тут не нужны:

public int CompareTo(object obj)
{
    Detal target = (Detal) obj;
    if (name != target.name)
    {
        return name.CompareTo(target.name);
    }
    else
    {
        return vaga.CompareTo(target.vaga);
    }
}

Стандартный CompareTo() у системных типов уже имеет свою реализацию, поэтому вам не обязательно делать собственные проверки, вы можете просто использовать его возможности.

Для того чтобы вызвать сортировку списка вам нужно сделать это явно, т.е вызвав у списка метод .Sort();

Так же, в своём классе вы реализовали интерфейс ICompare - это интерфейс компаратора("сравнивателя"). Т.е. вы можете сортировать свою коллекцию с помощью разных компараторов и тогда логика сравнения переносится наружу непосредственно в инструмент.

При вызове у массива/листа метода .Sort() вы можете передать в него экземпляр своего компаратора, если вы этого не сделаете - будет использоваться базовый, который пытается использовать логику интерфейса IComparable у сравниваемых экземпляров

Документация по интерфейсу IComparer

READ ALSO
Нужно найти проверку реф ссылки и убрать её [требует правки]

Нужно найти проверку реф ссылки и убрать её [требует правки]

Есть вот такой робот, подскажите пожалуйста, где идёт проверка реф ссылки? без неё он не работает, помогите убрать эту проверку

236
Слайдер на JavaScript

Слайдер на JavaScript

Подскажите, пожалуйста, что я делаю неправильноМне нужно сделать управляемый цикличный слайдер

242
reduce в digital_root

reduce в digital_root

Ребята, здравствуйтеДелаю задания на codewars, не могу понять, почему последняя итерация reduce возвращает конкатенацию вместо сложения

211
Как сделать вход с помощью LinkedIn?

Как сделать вход с помощью LinkedIn?

Доброго времени суток, на сайте нужно сделать кнопку входа через LinkedInСделал как тут написано

189