首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >string.equals给出了误报

问string.equals给出了误报
EN

Stack Overflow用户
提问于 2017-04-08 02:46:24
回答 2查看 251关注 0票数 0

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

代码语言:javascript
复制
    ....
    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是相同的,那么这条记录是如何结束的?

EN

回答 2

Stack Overflow用户

发布于 2017-04-08 15:31:05

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

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

票数 0
EN

Stack Overflow用户

发布于 2017-04-11 00:29:41

因此,字符串确实是不同的。仔细的二进制比较显示,在字符串的一个版本中有回车符,而在另一个版本中没有。我不得不将数据直接从数据库中提取出来进行比较...

代码语言:javascript
复制
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,将所有换行符转换为Unix版本。所以

代码语言:javascript
复制
if (!String.Equals(OldEventInfo.supportNotes, NewEventInfo.supportNotes))

变成了

代码语言:javascript
复制
if (!String.Equals(OldEventInfo.supportNotes.Replace("\r",""), NewEventInfo.supportNotes.Replace("\r","")))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43285152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档