2016-11-01 130 views
0

我正在使用EWS查找項目。我期望結果集大於頁面大小,所以我實現了一個檢查來確保我的結果集在分頁時不會改變。該代碼幾乎與Microsoft在下面的鏈接中推薦的相同。EWS比較ItemID顯示不匹配,但ItemID.ToString比較顯示匹配。

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

的問題是,第一項ID和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比較法是行不通的推薦的方式。但是,另一方面,我無法解釋爲什麼字符串比較總是起作用。有沒有人對我爲什麼會看到這些奇怪而矛盾的結果有任何想法。

回答

0

我sucpect什麼該行正在發生的事情:

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

眼見項目Id物體,或其父母在,不重寫=運算符! ItemId的對象引用正在進行比較。這應該總是返回true,因爲我們爲每個ItemId創建一個不同的對象。

但toString()方法是由該重寫:

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

這就解釋了在鍵的比較不錯,爲什麼比較這個結果。 處理這個我認爲最好的方法是使用有它自己實現的項目Id類的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