Проблема реализации IComparable <T>в C # - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь отсортировать массив в Unity по имени, используя Array.Sort().

Я читал столько, сколько мог, но все еще не могу адаптировать его в свой маленький проект здесь.Вот что у меня есть:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;

public class UIController : MonoBehaviour, IComparable<Slot>
{
    public static UIController instance;
    public Text uiMessageBox;
    public Slot[] slots;

    private void Awake()
    {
        if (instance == null)
            instance = this;
        else
            Destroy(this);

        DontDestroyOnLoad(this);

        slots = FindObjectsOfType<Slot>();
        Array.Sort(slots, ); // HELP: NOT SURE WHAT TO PUT HERE
    }

    public int CompareTo(Slot other)
    {
        return this.name.CompareTo(other.name);
    }
}

Обратите внимание, я удалил части, которые, по моему мнению, не имеют отношения к этому классу (например, код, отображающий строку сообщения на экране и т. Д.).Если этого кода недостаточно, пожалуйста, дайте мне знать, и я опубликую все это.

ТАКЖЕ ПРИМЕЧАНИЕ: я реализую здесь IComparable<Slot>, но я также попробовал это с IComparable<UIController>.(Как я уже сказал, я видел много примеров здесь и на других сайтах, но не могу заставить его работать в моем коде.)

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Я смог сохранить код в своем классе UIController, как я и предполагал (поскольку я построил массив слотов, для меня было правильным также отсортировать его там).

Вот как это делается:

public class UIController : MonoBehaviour, IComparer<Slot>
{
public static UIController instance;
public Text uiMessageBox;
public Slot[] slots;


private void Awake()
{

    slots = FindObjectsOfType<Slot>();
    Array.Sort(slots, this); // i just passed 'this' as the IComparer parameter :)

}

public int Compare(Slot x, Slot y)
{
   return x.name.CompareTo(y.name);
}

}

0 голосов
/ 25 декабря 2018

Почему бы не использовать форму делегата?

Array.Sort(slots, (slot1, slot2) => slot1.name.CompareTo(slot2.name));

Если вы все еще хотите реализовать интерфейс IComparable, вы должны написать его в классе Slot .

ИВы также можете реализовать интерфейс IComparer в любом классе.

class AnyClass : IComparer<Slot>
{
    public int Compare(Slot slot1, Slot slot2)
    {
        return slot1.name.CompareTo(slot2.name);
    }
}
...