EWS 比较 ItemID 显示不匹配,但 ItemID.ToString 比较显示匹配。
EWS comparing ItemIDs shows no match but ItemID.ToString comparison shows a match.
我正在使用 EWS 查找项目。我希望结果集大于页面大小,因此我实施了检查以确保我的结果集在分页时不会更改。该代码与 Microsoft 在下面的 link 中推荐的代码几乎相同。
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 和 acnnchorID 永远不匹配,即使我确定集合没有改变。此外,如果我将 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 字符串总是匹配。
问题
我不愿意放弃 Microsoft 推荐的方法以支持字符串比较方法,尤其是因为我无法解释为什么 FolderID 比较方法不起作用。但是,另一方面,我无法解释为什么字符串比较总是有效。有没有人对我为什么会看到这些奇怪且相互矛盾的结果有任何想法。
我猜想发生在这一行中:
if (results.Items.First<Item>().Id != anchorId)
看到 ItemId 对象或其父对象没有覆盖 != 运算符。正在比较 ItemId 的对象引用。这应该始终 return 为真,因为我们为每个 ItemId 创建了一个不同的对象。
但是 toString() 方法被这个覆盖了:
public override string ToString()
{
return (this.uniqueId == null) ? string.Empty : this.uniqueId;
}
这就解释了为什么比较这个结果可以很好地比较键。
我认为处理此问题的最佳方法是使用 ItemId class 的 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
我正在使用 EWS 查找项目。我希望结果集大于页面大小,因此我实施了检查以确保我的结果集在分页时不会更改。该代码与 Microsoft 在下面的 link 中推荐的代码几乎相同。
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 和 acnnchorID 永远不匹配,即使我确定集合没有改变。此外,如果我将 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 字符串总是匹配。
问题
我不愿意放弃 Microsoft 推荐的方法以支持字符串比较方法,尤其是因为我无法解释为什么 FolderID 比较方法不起作用。但是,另一方面,我无法解释为什么字符串比较总是有效。有没有人对我为什么会看到这些奇怪且相互矛盾的结果有任何想法。
我猜想发生在这一行中:
if (results.Items.First<Item>().Id != anchorId)
看到 ItemId 对象或其父对象没有覆盖 != 运算符。正在比较 ItemId 的对象引用。这应该始终 return 为真,因为我们为每个 ItemId 创建了一个不同的对象。
但是 toString() 方法被这个覆盖了:
public override string ToString()
{
return (this.uniqueId == null) ? string.Empty : this.uniqueId;
}
这就解释了为什么比较这个结果可以很好地比较键。 我认为处理此问题的最佳方法是使用 ItemId class 的 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