.Equals或==总是返回false

时间:2017-10-27 10:02:08

标签: c# csv datatable

这是我的问题。

我有2个数据表提交完全相同的内容,但我不明白为什么,当我比较他们的列时,==.Equals都不能返回true。

public void btn_Source_Click(object sender, EventArgs e)
    {            
        FichierSource.OuvertureSource();
        FichierSource.OuvertureBanque(comboBox1);
        int i = 0;
        foreach (DataColumn colonne in FichierSource.DTSource.Columns)
        {
            if (colonne == FichierSource.DTBanque.Columns[i]) 
                MessageBox.Show("Same");
            else
                MessageBox.Show("Not the same");
            i++;
        }
    }

两个数据表都是2个不同CSV的字段,但CSV都有以下内容: Nom|Prenom|Date|numero Jack|Jared|17.04.17|1626010548999 Daphne|Orli|08.02.18|1660101461799 Dphne|Thane|04.06.18|1635062807599 Odessa|Gannon|08.02.18|1626032546899 Charles|Jena|22.11.16|1626040845399

我解决了很多相同的问题而且我认为我理解了==和.Equals之间的区别但是这2个都没有返回true,为什么?

编辑: 这是一个包含变量值enter image description here

的屏幕截图

2 个答案:

答案 0 :(得分:8)

  1. 您不会比较DataTables的内容,而是DataColumns的内容(其中包含名称和类型)。
  2. 如果您使用==,则只需比较引用(您必须重载==运算符以按值进行比较f.e. System.String does
  3. Equals也无济于事,因为DataColumn不会覆盖它。因此使用Object.Equals来比较引用(类似于==)。由于这些实例是DataColumn个实例(名称相同但属于不同的表),Equals==,返回false
  4. 如果您想将一个DataRow的所有字段与另一个DataRow的所有字段进行比较,您可以使用DataRowComparerer.Default,而您必须循环行而不是列:

    var rowFieldComparer = DataRowComparer.Default;
    for(int i = 0; i < FichierSource.DTSource.Rows.Count; i++)
    {
        if (rowFieldComparer.Equals(FichierSource.DTSource.Rows[i], FichierSource.DTBanque.Rows[i]))
            MessageBox.Show("Same");
        else
            MessageBox.Show("Not the same");
    }
    

答案 1 :(得分:0)

两个对象都是不同的实例。您应该检查它们的原始属性或编写方法来比较2个对象。