为什么当每个 Individual 属性返回 true 时,整个模型的比较返回 false

Why does comparison of entire model return false when each Individual properties return true

提问人:MBNLINK 提问时间:8/2/2022 最后编辑:MBNLINK 更新时间:8/2/2022 访问量:88

问:

我想做什么:

我希望用户在组合框中选择配色方案,然后我稍后在执行时将其用于一些 UI 内容(这工作正常),但我想保存该配色方案并通过 MVVM 和绑定使该项目在下次用户打开窗口时在组合框中被选中,但它不起作用。

我做了一个模型来容纳我的配色方案:

[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public class ColorScheme
{
    public int Id { get; set; }
    public SolidColorBrush ColorOne { get; set; }
    public SolidColorBrush ColorTwo { get; set; }
    public SolidColorBrush ColorThree { get; set; }
    public SolidColorBrush ColorFour { get; set; }
    public SolidColorBrush ColorFive { get; set; }
    public SolidColorBrush ColorSix { get; set; }
    public SolidColorBrush ColorSeven { get; set; }
    public SolidColorBrush ColorEight { get; set; }
    public SolidColorBrush ColorNine { get; set; }
    public SolidColorBrush ColorTen { get; set; }

}

然后,我将配色方案存储在用户的settings.settings文件中,但是当我重新打开窗口时,组合框是空的,即使配色方案包含颜色的确切十六进制值。

当我测试配色方案列表和我存储的配色方案之间的比较时,它返回 false,但有趣的是,如果我将其划分为单独的属性比较,它会在所有属性比较上返回 true:

foreach (var colorScheme in AllColorSchemes)
        {
            if (SelectProjectColorScheme != null)
            {

                if (colorScheme.Id == SelectProjectColorScheme.Id
                    || colorScheme.ColorOne == SelectProjectColorScheme.ColorOne
                    || colorScheme.ColorTwo == SelectProjectColorScheme.ColorTwo
                    || colorScheme.ColorThree == SelectProjectColorScheme.ColorThree
                    || colorScheme.ColorFour == SelectProjectColorScheme.ColorFour
                    || colorScheme.ColorFive == SelectProjectColorScheme.ColorFive
                    || colorScheme.ColorSix == SelectProjectColorScheme.ColorSix
                    || colorScheme.ColorSeven == SelectProjectColorScheme.ColorSeven
                    || colorScheme.ColorEight == SelectProjectColorScheme.ColorEight
                    || colorScheme.ColorNine == SelectProjectColorScheme.ColorNine
                    || colorScheme.ColorTen == SelectProjectColorScheme.ColorTen)
                {
                    var test = "yes";
                }

                if (colorScheme == SelectProjectColorScheme)
                {
                    var test = "yes";
                }
            }
        }

在上面的代码中,第一个 if 语句在所有参数上都返回 true,但底部返回 false。我尝试在 SolidColorBrushes、Brushes 之间切换,将 HEX 值转换为画笔并使用预定义的画笔。它对我不起作用。

我对可能导致这种情况的原因感到茫然,我希望有解决方法或更好的方法来做到这一点。这应该是一个相当简单的任务,我花了 3 天多的时间试图修复它。

C# 比较 SolidColorBrush

评论


答:

1赞 Traveller 8/2/2022 #1

你的模型是一个引用类型,所以当你调用 == 时,它实际上是在检查引用相等性(即检查它们是否只是同一对象的两个不同名称,而不是检查它们是否是两个具有相同值的对象,这才是你真正想要的)。可以重写 == 方法来检查值,但阅读本指南时,他们建议不要对可变类型这样做。我不完全确定为什么会这样(很可能是一些深刻的编程哲学),但他们的建议是改写 Equals() 作为适当的值检查并调用它。请注意,如果你走这条路,你还应该覆盖 GetHashCode() (也许只是 ^ 所有值的哈希码一起或其他东西)。

另一方面,如果您默认将模型更改为结构体,则 Equals() 将进行值比较,但 == 将无法按照您想要的方式工作,除非您手动覆盖它。

如果您使用的是 C#9 或更高版本,则可以考虑记录类型,如果调用 ==,它将进行值比较。 这里有几个更有用的链接,祝你好运。

https://learn.microsoft.com/en-us/dotnet/api/system.valuetype.equals?view=net-6.0#system-valuetype-equals(系统对象)

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/equality-operators

评论

1赞 MBNLINK 8/2/2022
谢谢你,把我的模型变成一个结构体并使用.Equals() 起作用了,将模型变成结构体也使组合框的 selecteditem 的绑定起作用。但是 - 我只能比较 Brushes.X 颜色,所以我现在只能将其视为部分修复。无论如何,我已经接受了你的回答,因为我确实学到了一些东西。所以是的,谢谢。