如何检查同一类的两个实例之间是否仍具有与null相同的成员

问题描述 投票:0回答:2

我有一个类,用于指定像这样的类型

public class TypeSpec 
{
  public int? maxLength {get; set;} = null;
  public int? minLength {get; set;} = null;

  public int? maxInteger {get; set;} = null;
  public int? minInteger {get; set;} = null;
}

TypeSpec typeA = new TypeSpec() 
{
  maxLength = 10;
  minLength = 0;
}

TypeSpec typeB = new TypeSpec() 
{
  maxLength = 10;
  minLength = 5;
  maxInteger = 0;
}

如何检查TypeB是否仍将MaxInteger作为null,并触发false,以确保此处更改的值只是从0-10到5-10的maxLength和MinLength?

比较它们,例如typeB == typeA将输出false,因为它们不相同?

c# asp.net-core equality
2个回答
1
投票

在这个问题上也不是很清楚。在typeB.maxIntegernull时返回false的简单版本如下所示:var result = typeB.maxInteger.HasValue ? true : false;

尽管您似乎试图实现一些自定义对象相等性检查,所以您需要看一下实现IEquatable和相关的重载:

public class TypeSpec : IEquatable<TypeSpec>
{
    public int? maxLength { get; set; } = null;
    public int? minLength { get; set; } = null;

    public int? maxInteger { get; set; } = null;
    public int? minInteger { get; set; } = null;

    public static bool operator ==(TypeSpec a, TypeSpec b)
        => a.Equals(b);

    public static bool operator !=(TypeSpec a, TypeSpec b)
        => !a.Equals(b);

    public bool Equals(TypeSpec other)
    {
        var result = GetHashCode() == other.GetHashCode();
        return result;
    }

    public override bool Equals(object obj)
    {
        return this == obj as TypeSpec;
    }

    public override int GetHashCode()
    {
        var maxI = maxInteger.HasValue ? maxInteger.Value : default;
        var minI = minInteger.HasValue ? minInteger.Value : default;
        var minL = minLength.HasValue ? minLength.Value : default;
        var maxL = maxLength.HasValue ? maxLength.Value : default;

        var result = (maxI + minI + minL + maxL).GetHashCode();
        return result;
    }
}

public class Program
{
    public static void Main()
    {

        TypeSpec typeA = new TypeSpec()
        {
            maxLength = 10,
            minLength = 0
        };

        TypeSpec typeB = new TypeSpec()
        {
            maxLength = 10,
            minLength = 0,
            maxInteger = null
        };

        var result = typeB == typeA;

    }
}

0
投票

我想您想比较typeA和typeB的属性值。有几种方法。最简单的是比较每个属性。如果typeA.MaxInt为null,而typeB.MaxInt为null,则typeA.MaxInt == typeB.MaxInt将为您提供true。

© www.soinside.com 2019 - 2024. All rights reserved.