在一个列表中,有没有一种方法可以对颜色元素进行排序 (c#)?

3
我的想法是有一个排序机制,按照红色值排序(后面我还想扩展到可以按绿色和蓝色值进行排序)。但我在实现这个排序机制时遇到了麻烦。
我有一个名为“Colorbox”的类,它基本上是一个“List<Color>”,但这样我可以将“List<Color>”放在“List<Colorbox>”中。
我的主要目标是能够按照1种颜色(红、蓝、绿)的值对此“Colorbox”进行排序。(例如,使列表中最左边的值具有最少的红色)。
我尝试实现一个“toCompare”覆盖(不知道在C#中是否有效,但我知道在Java中,当您调用“sort()”方法时,也会调用比较函数“compare”)。
这给了我以下代码:
public int CompareTo(object obj) {
    Color toCompare = (Color) obj;
    if (this.CompareTo(toCompare) == 1)
    {
        return 1;
    }
    else 
    {
        return 0;
    }
}

但是我不知道如何在那里实现按颜色排序或一般的排序。我需要编写额外的sort()代码以覆盖原来的代码吗?

我其实不知道这个排序代码应该做什么。它是否按值顺序排列,直到可以遍历列表且没有任何更改为止?或者这种方法对于这个想法来说太冗长了?

下面是类的通用代码:

internal class Colorbox
{
    private List<Color> box = new List<Color>();
    int colorPicker = 0;
    public Colorbox(List<Color> colorList)
    {
        this.box = colorList;
    }
}

我希望有人可以帮助解释,我该做什么或者我应该从哪个方向去解决这个问题。

非常感谢,如果我表达不清楚,请随时询问。

2个回答

4

我认为您想要使用IComparer<T>接口比较您的Color类型。 以下是使用LinqPad的示例。 RedColorComparer实现将根据它们所拥有的红色数量(DESCENDING)对Colors进行排序,这正是您想要的。 请注意,在Array.Sort行中使用它。

void Main()
{
    var colors = new Color[] { Color.Red, Color.Blue, Color.Gray };
    Array.Sort(colors, new RedColorComparer());
    colors.Dump();
}

public class RedColorComparer : IComparer<Color>
{
    public int Compare(Color a, Color b)
    {
        if (a.R < b.R)
            return 1;
        else if (a.R == b.R)
            return 0;
        else 
            return -1;
    }
}

结果如下所示:

这里输入图片描述


注:该内容涉及IT技术,已尽力使翻译通俗易懂,若有不妥之处敬请指出。

1
适合教学,但在您的比较方法中,(b.R - a.R) 也可以做同样的事情,因为只有符号被评估。 - Holger
colors.Dump() 究竟是做什么的? - Jirka
1
这是一个 LinqPad 特定的命令,它可以为您提供图像中漂亮的输出。 - SWeko

1
您可以从Color结构中获取字节。例如,
Color slateBlue = Color.FromName("SlateBlue");
byte g = slateBlue.G;
byte b = slateBlue.B;
byte r = slateBlue.R;
byte a = slateBlue.A;
string text = String.Format("Slate Blue has these ARGB values: Alpha:{0}, " +
    "red:{1}, green: {2}, blue {3}", new object[] { a, r, g, b });

然后尝试对这些字节进行排序,实现 ICompare 接口。

public class SortColorByRed : IComparer<Color>
{
    public int Compare(Color x, Color y)
    {
        if (x == null || y == null)
        {
            return 0;
        }
        return x.R.CompareTo(y.R);
    }
}

然后在排序中通过传递比较使用它

var color1 = new Color();
var color2 = new Color();
List<Color> list = new List<Color>(){color1,color2};
SortColorByRed sortByRed = new SortColorByRed(); 
list.Sort(sortByRed);

好的,除非颜色是一个结构体并且不能变为空,否则编译器会报错。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接