我通过USB通信获取一些数据到我的程序中 - > RGB的3个字节。
我将这些字节放入"新的SolidColorBrush"我得到"刷"进行。
Brush ColorActiveDark = new SolidColorBrush(Color.FromRgb(USBred, USBGreen, USBBlue));
后来我在" MyList"中搜索了这个画笔。但alwasy采取默认值。为什么它在我的列表中找不到相同的值?
_illumination.SelectedColorAN = _illumination.ColorList.SingleOrDefault(x => x.Color == ColorActiveDark) ?? _illumination.ColorList[0];
MyList定义如下:
public class ColorItem
{
public string ColorName { get; set; }
public Brush Color { get; set; }
}
以后的ColorList
public IList<ColorItem> ColorList { get; set; }
ColorList = new List<ColorItem>()
{
new ColorItem() { ColorName = "AppleGreen", Color = new SolidColorBrush(Color.FromRgb(76, 196, 23)) }, //
new ColorItem() { ColorName = "Mustard", Color = new SolidColorBrush(Color.FromRgb(255, 219, 88)) }, //
new ColorItem() { ColorName = "Red", Color = new SolidColorBrush(Color.FromRgb(255, 0, 0)) }, //
new ColorItem() { ColorName = "Device1", Color = new SolidColorBrush(Color.FromRgb(0, 31, 0)) }, //
new ColorItem() { ColorName = "Device2", Color = new SolidColorBrush(Color.FromRgb(0, 255, 0)) }, //
new ColorItem() { ColorName = "Device3", Color = new SolidColorBrush(Color.FromRgb(31, 0, 0)) }, //
};
我的错误在哪里?如果有任何问题请询问。我希望我写得尽可能简单和理解。谢谢!
答案 0 :(得分:2)
这是因为您正在比较对象的两个不同实例,它们不匹配。
相反,您可以搜索ColorName
并返回:
_illumination.SelectedColorAN = _illumination.ColorList.SingleOrDefault(x => x.ColorName == "AppleGreen") ?? _illumination.ColorList[0];
或者,将RGB值存储在ColorItem
对象中以匹配该值。
public class ColorItem
{
public string ColorName { get; set; }
public Brush Color { get; set; }
public int Red { get; set; }
public int Green { get; set; }
public int Blue { get; set; }
}
答案 1 :(得分:1)
这里的问题是,当您比较班级的不同实例时,条件x.Color == ColorActiveDark
将始终失败。因此==
将检查引用是否相等(显然它们不是)。您想要的是通过实施object.Equals
来检查您的班级的某些属性是否相等:
class Brush {
override bool Equals(object other) {
Brush b = other as Brush;
if (b == null) return false;
return b.ColorName == this.ColorName;
}
}
甚至可以通过比较ColorItem
- 属性进行比较,同时您还必须为Equals
实施ColorItem
:
public class ColorItem
{
override bool Equals(object other) {
ColorItem c = other as ColorItem;
return c.Red == this.Red && c.Blue = this.Blue && c.Green == this.Green;
}
}
编辑:你也购买了==
的运营商实现,如下所示:
public static bool operator == (Brush a, Brush b) {return a.Equals(b); }
并ColorItem
相应地。
答案 2 :(得分:0)
据我所知,你总是有_illumination.ColorList[0]
的价值。如果是这样,那是因为SingleOrDefault
方法无法找到您的集合中唯一的一个元素符合您的条件,它会返回null
(如果使用Single
方法如果找不到单个元素则抛出错误。因此,您收到了null
,最终您将获得_illumination.ColorList[0]
值。
接下来是您拥有null
的原因。您试图通过引用的相等性而不是它们的字段值来比较对象。如果您需要比较这些对象,有时可能最好为此重载==
运算符。另一种可能的情况是通过一个(或一些)有价值的字段(属性)比较两个对象。还有一种情况是创建您可以用作搜索条件的特定Expression