EWS比较ItemIDs显示没有匹配,但ItemID.ToString比较显示匹配。

时间:2016-11-01 23:33:49

标签: c# exchangewebservices

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

How to: Perform paged searches by using EWS in Exchange

以下是相关的代码段:

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.");

我尝试在不同的结果集上运行代码并使用不同的页面大小,结果始终相同:ItemIds永远不匹配,但ID字符串始终匹配。

问题

我不愿意放弃微软推荐的方法,而采用字符串比较方法,特别是因为我无法解释为什么FolderID比较方法不起作用。但是,另一方面,我无法解释为什么字符串比较总是有效。有没有人想过为什么我会看到这些奇怪而矛盾的结果。

1 个答案:

答案 0 :(得分:2)

我在这一行中所取得的成就:

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