我的想法是我有一个排序机制,可以根据红色值进行排序(稍后我希望以此为基础,因此我也可以按绿色和蓝色值进行排序)。 我在实现这种排序机制时遇到了麻烦。
我有一个名为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;
}
}
我希望有人可以帮助解释我应该做什么或应该朝哪个方向解决这个问题。
非常感谢,问我是否不清楚。
答案 0 :(得分:3)
我相信您希望IComparer<T>
界面比较您的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;
}
}
结果如下:
答案 1 :(得分: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);