string.equals给出误报

时间:2017-04-07 18:46:24

标签: c# asp.net string dataset

在将事件存储到事件管理系统中时,我还存储了更改的历史记录。因为项目指定使用MySql,并且MySql触发器留下了一些需要,我使用实际代码来检测更改。我有以下代码行来查看支持说明字段是否已更改,并相应地添加历史记录:

    ....
    if (!String.Equals(OldEventInfo.supportNotes, NewEventInfo.supportNotes))
    {  ChangesMade.Add(new EventHistoryDataItem("support notes", OldEventInfo.supportNotes, NewEventInfo.supportNotes)); }
    ....
    EventsDataset eds = new EventsDataset();
    EventsDatasetTableAdapters.eventhistoryTableAdapter ehta = new EventsDatasetTableAdapters.eventhistoryTableAdapter();
    EventsDatasetTableAdapters.eventhistorydataTableAdapter ehdta = new EventsDatasetTableAdapters.eventhistorydataTableAdapter();
    Int64 HistoryId = Convert.ToInt64(ehta.InsertQuery(NewEventInfo.id.Value, DateTime.Now, UserId));

    eds.eventhistorydata.Clear();
    foreach (EventHistoryDataItem thisChange in ChangesMade)
    {
        EventsDataset.eventhistorydataRow newRow = (EventsDataset.eventhistorydataRow)eds.eventhistorydata.NewRow();
        newRow.eventHistoryId = HistoryId;
        newRow.field = thisChange.Field;
        newRow.oldValue = thisChange.OldValue;
        newRow.newValue = thisChange.NewValue;
        eds.eventhistorydata.AddeventhistorydataRow(newRow);
    }
    ehdta.Update(eds.eventhistorydata);

问题是我正在获取前后相同值的“支持说明”的历史记录。我已经查看了关于string.equals生成错误返回的其他问题,我已经检查过以确保前后字符串是相同的,它们是相同的。没有额外的空格或回车或换行符。它们是二进制相同的。

那么,是什么给出的?在我的历史记录中,记录结果如何表示值已从A更改为B,但A和B是否相同?

2 个答案:

答案 0 :(得分:0)

这是因为字符串编码不同,它们的字符串不相等,尽管它们包含相同的字符。

如果你想比较两个字符串并且它们来自不同的来源,并且你不担心编码,那么使用string.Normalize()方法比较它们就可以了。

答案 1 :(得分:0)

所以字符串确实不同。 仔细二进制比较显示在一个版本的字符串中有一个回车而在另一个版本中没有。我不得不直接从数据库中提取数据来比较它们......

select hex(OldValue), hex(NewValue) from EventHistoryData where Id = 39645;

它揭示了那里应该有一个新行,一个版本的字符串有一个Windows实现的新行(CarriageReturn + LineFeed = \ r \ n = x0D0A),另一个版本的Unix实现换行(LifeFeed = \ n = x0A)。   在我的Windows IIS机器和Unix机器上的MySql服务器之间,字符串的新行被转换为Unix实现。

最简单的解决方案是更改比较以忽略回车。由于Windows NewLine是\ r \ n并且Unix和Mac换行符是\ n,因此在比较字符串时最简单的方法是删除\ r \ n,将所有换行符转换为Unix版本。所以

if (!String.Equals(OldEventInfo.supportNotes, NewEventInfo.supportNotes))

变为

if (!String.Equals(OldEventInfo.supportNotes.Replace("\r",""), NewEventInfo.supportNotes.Replace("\r","")))