EWS比较ItemID显示没有匹配项,只有ItemID.ToString比较显示匹配

本文关键字:显示 比较 ItemID 只有 ToString EWS | 更新日期: 2023-09-27 18:15:48

我正在使用EWS查找项目。我希望结果集大于页面大小,因此我实现了一个检查,以确保结果集在分页时不会更改。代码与下面的链接中微软推荐的代码几乎相同。

如何:在Exchange

中使用EWS执行分页搜索以下是相关代码片段:
if (results.Items.First<Item>().Id != anchorId)
{
    Console.Writeline("The collection has changed while paging. " + 
    "Some results may be missed.");
}

问题是,第一个ItemID和acnchorID永远不匹配,即使我确信集合没有改变。进一步说,如果我将id转换为字符串并进行如下的字符串比较,它们总是匹配的。

string a = results.Items.First<Item>().Id.ToString();
string b = anchorId.ToString();
bool result = a.Equals(b, StringComparison.Ordinal);
Debug.Print("Ordinal comparison: {0}",result ? "equal." : "not equal.");

我试过在不同的结果集和不同的页面大小上运行代码,结果总是一样的:itemid从不匹配,但ID字符串总是匹配。

我不愿意放弃微软推荐的方法来支持字符串比较方法,特别是当我无法解释为什么FolderID比较方法不起作用时。但是,另一方面,我不能解释为什么字符串比较总是有效的。有人知道为什么我会看到这些奇怪而矛盾的结果吗?

EWS比较ItemID显示没有匹配项,只有ItemID.ToString比较显示匹配

我猜想这一行发生了什么:

if (results.Items.First<Item>().Id != anchorId)

查看ItemId对象,或者它的父对象,不要覆盖!=操作符。正在比较ItemId的对象引用。这应该总是返回true,因为我们为每个ItemId创建了一个不同的对象。

但是toString()方法被重写了:

        public override string ToString()
        {
            return (this.uniqueId == null) ? string.Empty : this.uniqueId;
        }

这就解释了为什么比较这个结果可以很好地比较键。我认为处理这个问题的最好方法是使用ItemId类的equals方法,它有自己的实现:

public override bool Equals(object obj)
{
            if (object.ReferenceEquals(this, obj))
            {
                return true;
            }
            else
            {
                ServiceId other = obj as ServiceId;
                if (other == null)
                {
                    return false;
                }
                else if (!(this.IsValid && other.IsValid))
                {
                    return false;
                }
                else 
                {
                    return this.UniqueId.Equals(other.UniqueId);
                }
            }
}

所以结论使用这个来比较键:

if (!results.Items.First<Item>().Id.Equals(anchorId))
{
    Console.Writeline("The collection has changed while paging. " + 
    "Some results may be missed.");
}

如果你有兴趣,你可以访问github页面的源代码:https://github.com/OfficeDev/ews-managed-api