【问题标题】:Is there a way to sort Color elements in a list (c#)?有没有办法对列表中的颜色元素进行排序(c#)?
【发布时间】:2020-02-09 20:33:41
【问题描述】:

我的想法是我有一个根据红色值排序的排序机制(稍后我想在此基础上进行构建,这样我也可以按绿色和蓝色值排序)。 我在实现这种排序机制时遇到了问题。

我有一个名为Colorbox 的类,它基本上是List<Color>,但这样我可以将List<Color> 放在List<Colorbox> 中。

我的平均目标是我可以根据 1 种颜色(红色、蓝色、绿色)值订购此 Colorbox。 (例如,列表中最左边的值的红色最少)。

我尝试实现 toCompare 覆盖(不知道这是否适用于 C#,但我知道在 Java 中,当您调用 sort() 方法时也会调用比较)。

这给了我如下代码:

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

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

已经非常感谢了,如果我还不清楚,请问。

【问题讨论】:

    标签: c# list class sorting


    【解决方案1】:

    你可以从Color Struct 获取字节。例如,

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

    【讨论】:

    • 很好,除了颜色是结构体并且不能为空,编译器会针对它进行处理。
    【解决方案2】:

    我相信您希望IComparer&lt;T&gt; 接口来比较您的Color 类型。 这是使用 LinqPad 的示例。 RedColorComparer 实现将根据颜色的降序对颜色进行排序,这听起来像是您想要的。请注意将其与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;
        }
    }
    

    结果是这样的:

    【讨论】:

    • 适合教学,但 (b.R - a.R) 在您的比较方法中也会这样做,因为只评估符号。
    • colors.Dump(); 的作用是什么?到底是做什么的?
    • 这是一个LinqPad 特定的命令,可以在图像中为您提供漂亮的输出。
    猜你喜欢
    • 2020-03-28
    • 2019-11-15
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多