LINQ SingleOrDefault,刷机,我做错了什么?

时间:2016-01-08 07:53:52

标签: c# linq list brush

我通过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)) }, // 
        };

我的错误在哪里?如果有任何问题请询问。我希望我写得尽可能简单和理解。谢谢!

3 个答案:

答案 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