无法在C#中实现IComparable <t>

时间:2018-12-25 14:38:35

标签: c# arrays icomparable

我正在尝试使用Array.Sort()在Unity中按名称对数组进行排序。

我一直在阅读,但仍然无法适应这里的小项目。这是我到目前为止的内容:

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 :(得分:2)

为什么不使用委托表格?

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);
    }
}

答案 1 :(得分:1)

我能够将代码保留在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);
}

}