7

URIに基づいてオブジェクトのコレクションを維持しようとしています:

public class ConceptCollection : KeyedCollection<Uri, Concept> {
    protected override Uri GetKeyForItem(Concept item) {
        return item.Uri;
    } 
}

ただし、URI は通常、Uri のフラグメントに基づいてのみ異なります。したがって、次の場合はエラーが発生します。

ConceptCollection wines = new ConceptCollection();
Concept red = new Concept("http://www.w3.org/2002/07/owl#RedWine");
Concept white = new Concept("http://www.w3.org/2002/07/owl#WhiteWine");
wines.Add(red);
wines.Add(white); // Error: An item with the same key has already been added.

http://msdn.microsoft.com/en-us/library/f83xtf15.aspxごと:

Equals メソッドは、ユーザー情報 ( UserInfo) およびフラグメント ( Fragment) 部分に関係なく、2 つのインスタンスを比較します。たとえば、URI が http://www.contoso.com/index.htm#search および http://user:password@www.contoso.com/index.htmの場合、Equals メソッドは true を返します。

私はこれをハックしなければならないことに辞任しています。しかし、なぜこのように振る舞うのでしょうか。ユーザー情報のロジックはわかりますが、フラグメントのロジックはわかりません。

4

2 に答える 2

10

RFC 2396から:

4.1. フラグメント識別子

URI参照を使用して識別されたリソースに対して検索アクションを実行する場合、オプションのフラグメント識別子は、クロスハッチ(「#」)文字でURIから分離され、検索後にユーザー・エージェントによって解釈される追加の参照情報で構成されます。アクションは正常に完了しました。 そのため、これは URI の一部ではありませんが、しばしば URI と組み合わせて使用​​されます。

追加された強調は私のものであり、フラグメントが Uri.Equals 実装で考慮されない理由です。

この例では、取得するリソースの URI はhttp://www.w3.org/2002/07/owlです。

フラグメントはユーザーエージェントによって処理され、リソースの実際の取得には意味がなく、影響もありません。

于 2009-09-07T02:07:55.120 に答える
0

フラグメントを除いて同一の 2 つの URI は、リソース内の異なる場所を参照しているだけで、同じリソースを参照しているためだと思います。

ですから、「これらは同じリソースですか?」という質問をしている場合は、その場合、フラグメントを無視するのが正しいと主張できます。

于 2009-09-07T02:00:51.993 に答える