C# EWS比较ItemID不显示匹配项,但ItemID.ToString比较显示匹配项。

C# EWS比较ItemID不显示匹配项,但ItemID.ToString比较显示匹配项。,c#,exchangewebservices,C#,Exchangewebservices,我正在使用EWS查找项目。我希望结果集大于页面大小,因此我实施了一项检查,以确保我的结果集在分页时不会更改。该代码与Microsoft在下面的链接中推荐的代码基本相同 以下是相关的代码片段: if (results.Items.First<Item>().Id != anchorId) { Console.Writeline("The collection has changed while paging. " + "Some results may be mis

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

以下是相关的代码片段:

if (results.Items.First<Item>().Id != anchorId)
{
    Console.Writeline("The collection has changed while paging. " + 
    "Some results may be missed.");
}
if(results.Items.First().Id!=anchorId)
{
Console.Writeline(“分页时集合已更改。”+
“某些结果可能会被忽略。”);
}
问题是,第一个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.");
string a=results.Items.First().Id.ToString();
字符串b=anchorId.ToString();
bool result=a.Equals(b,StringComparison.Ordinal);
打印(“顺序比较:{0}”,结果?“相等”。:“不相等”);
我尝试在不同的结果集和不同的页面大小上运行代码,结果总是一样的:ItemIds从不匹配,但是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.");
问题


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

我认为这一行正在发生什么:

if (results.Items.First<Item>().Id != anchorId)
这就解释了为什么比较这两个键会得到很好的比较。 我认为最好的处理方法是使用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.");
}
if(!results.Items.First().Id.Equals(anchorId))
{
Console.Writeline(“分页时集合已更改。”+
“某些结果可能会被忽略。”);
}
如果您感兴趣,可以访问github页面获取源代码: