【问题标题】:Are structs holding the same values considered equal?具有相同值的结构是否被视为相等?
【发布时间】:2012-08-29 14:21:07
【问题描述】:

考虑这个结构。

public struct myStruct{
    public int value1;
    public int value2;
    public int value3;

    public myStruct(int val1, int val2, int val3){
        value1 = val1;
        value2 = val2;
        value3 = val3;
    }
}

现在考虑我有一些myStruct 类型的列表:

public List<myStruct> myList = new List<myStruct>();

现在我使用相同的值实例化 2 个不同版本的 myStruct

myStruct s1 = new myStruct(1,2,3);
myStruct s2 = new myStruct(1,2,3);

然后我将第一个实例添加到myList

myList.Add(s1);

然后我做一个简单的检查,看看第二个实例是否在列表中:

bool structsEqual = myList.Contains(s2);

structsEqual 是真是假?

【问题讨论】:

  • 您为什么不编译该代码并找出答案?但话又说回来,我确实喜欢一个很好的测验!但是话又说回来,这不是一个好的测验... :-( (顺便说一下,这将是true)。
  • 输出了什么??????
  • 为什么不直接在浏览器中输入这段代码,而不是在 Visual Studio 中输入?

标签: c# data-structures


【解决方案1】:

有趣的是,这个特定代码将等于 true,但如果结构包含没有系统类型的对象,那么您必须实现 IComparable 以使其不总是返回 false。

public struct myStruct
{ 
    public MyOwnType value1; 
    public int value2; 
    public int value3; 

    public myStruct(MyOwnType val1, int val2, int val3){ 
        value1 = val1; 
        value2 = val2; 
        value3 = val3; 
    } 
}

public class MyOwnType
{
    public int Id { get; set; }

    public MyOwnType(int id)
    {
        this.Id = id;
    }
}

要让 Contains 工作,您需要实现 IComparable:

public class MyOwnType : IComparable
{
    public int Id { get; set; }

    public MyOwnType(int id)
    {
        this.Id = id;
    }

    public int CompareTo(object obj)
    {
        if (obj == null) return 1;

        MyOwnType other = obj as MyOwnType;
        if (other != null)
            return this.Id.CompareTo(other.Id);
        else
            throw new ArgumentException("Object is not a MyOwnType");
    }
}

【讨论】:

  • 实现 IComparable 还是覆盖 Equals?
  • 你是对的,在这种情况下,Equals 会更好,因为它包含。 IComparable 用于订购。我的立场是正确的。
【解决方案2】:

你有所有的代码,你可以把它放在一个程序中并运行它,看看会发生什么。我使用 LinqPad,这就是我得到的...

public List<myStruct> myList = new List<myStruct>(); 

void Main()
{
    myStruct s1 = new myStruct(1,2,3); 
    myStruct s2 = new myStruct(1,2,3); 

    myList.Add(s1); 

    bool structsEqual = myList.Contains(s2); 

    structsEqual.Dump();
}

public struct myStruct{ 
    public int value1; 
    public int value2; 
    public int value3; 

    public myStruct(int val1, int val2, int val3){ 
        value1 = val1; 
        value2 = val2; 
        value3 = val3; 
    } 
} 

结果 = “真”

【讨论】:

    【解决方案3】:

    Structsvalue types,所以答案是True

    【讨论】:

      【解决方案4】:

      快速谷歌搜索到以下链接:

      http://www.java2s.com/Tutorial/CSharp/0120__struct/Valuetypeequalitydefaultbehavior.htm

      所以是的,它会是真的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-26
        • 2014-05-09
        • 2022-07-27
        • 2017-11-07
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        相关资源
        最近更新 更多