2009-09-07 17 views
5

私は彼らのURIに基づいてオブジェクトのコレクションを維持しようとしている:EqualsメソッドでUriのフラグメントが無視されるのはなぜですか?

public class ConceptCollection : KeyedCollection<Uri, Concept> { 
    protected override Uri GetKeyForItem(Concept item) { 
     return item.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パー:

The Equals method compares the two instances without regard to user information (UserInfo) and fragment ( Fragment) parts that they might contain. For example, given the URIs http://www.contoso.com/index.htm#search and http://user:[email protected]/index.htm , the Equals method would return true.

私はこの周りをハックすることに辞任していますので、以下のエラーが発生します。しかし、それはなぜこのように振舞うのでしょうか?私は、ユーザー情報のロジックを見ることができますが、フラグメントは見えません。

+0

私が扱ってきたRDFフレームワークは、.NET System.Uriの実装で独自のUriクラスを実装しなければならず、元のUriの純度は維持されません。あなたはSystem.Uri.OriginalStringを使用してこれを小さなプロジェクトで回避することができます。同様の問題は何度も何度も繰り返されます。 –

答えて

9

RFC 2396より:

4.1. Fragment Identifier

When a URI reference is used to perform a retrieval action on the identified resource, the optional fragment identifier, separated from the URI by a crosshatch ("#") character, consists of additional reference information to be interpreted by the user agent after the retrieval action has been successfully completed. As such, it is not part of a URI, but is often used in conjunction with a URI.

添加重点が鉱山であり、断片はUri.Equals実装では考慮されていない理由です。あなたの例では

は、あなたが取得しているリソースのURIは次のとおりです。http://www.w3.org/2002/07/owl

フラグメントは、ユーザエージェントによって処理され、リソースの実際の検索には何の意味や影響力を持っていません。

+0

きれいに見つかった。私の問題は、W3Cが、オントロジー要素を参照する際にフラグメントを一意の識別子として使用することにあると思います。 (使用したサンプルは、OWLのドキュメントと一貫していました)。乾杯。 – Adrian

+1

@Adrian:Uriは封印されたクラスではありません。 Uriから独自のクラスを派生させることで、これを達成することができます。これは、等号の振る舞いを変更してフラグメントを見ることです。 –

0

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

「もしこれらのリソースが同じですか?」フラグメントを無視するのが正しいと主張することができます。

+0

URL内のフラグメントのW3C記述へのリンクは次のとおりです。http://www.w3.org/TR/WD-html40-970708/htmlweb.html#h-4.1.1 –

+0

基本的なロジックがわかります。しかし、フラグメントを指定すると、リソースの一部(つまりフラグメント)のみを指定しているのではありません。例えば。 http:// me/body#leftHand対http:// me/body#rightFoot。 – Adrian

+0

@Adrian:リソース全体は引き続きユーザーエージェントによって取得されなければならず、UAがフルリソースの適切なセクション/フラグメントを指すようにフラグメントを処理することができます。リソースの一部だけを取得する方法はありません。 –

関連する問題