2016-11-01 15 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."); 

私は別の結果セットにし、異なるページサイズでコードを実行しようとしていると、結果は常に同じです:アイテムIDが一致することはありませんが、ID列が常に一致します。

質問

私はフォルダID比較アプローチが動作していない理由を私は説明できない、特にとして、文字列の比較アプローチに賛成して、マイクロソフトが推奨するアプローチをドロップするには消極的です。しかし、一方で、文字列比較が常に機能する理由を説明することはできません。なぜ、私がこれらの奇妙で矛盾した結果を見ているのか、誰にも考えがありますか?

答えて

0

私はこのラインで起こっているsucpect何!

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

は、アイテムIDオブジェクト、またはその親が、=演算子をオーバーライドしないことを見て。 ItemIdのオブジェクト参照が比較されています。これはItemIdごとに異なるオブジェクトを作成するため、常にtrueに戻ります。

しかし、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

関連する問題