2009-09-07 7 views
5

che sto cercando di mantenere una collezione di oggetti in base alla loro URI:Perché il frammento di un Uri viene ignorato nel metodo Equals?

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

Tuttavia, l'URI regolarmente solo differisce a seconda del Frammento della Uri. Così, la seguente causa un errore:

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. 

Per 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.

ho rassegnato a dover mettere mano intorno a questo. Ma perché si comporta in questo modo? Riesco a vedere la logica per le informazioni dell'utente, ma non per il frammento.

+0

Qualsiasi dei framework RDF con cui ho lavorato ha dovuto implementare la propria classe Uri come l'implementazione .NET System.Uri non mantiene la purezza dell'originale Uri. Potresti usare System.Uri.OriginalString per evitarlo su un progetto più piccolo ... problemi simili si ripeteranno ancora e ancora. –

risposta

9

Da 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.

L'enfasi aggiunta è mia ed è il motivo per il frammento non è considerato nella realizzazione Uri.Equals.

Nel tuo esempio, l'URI per la risorsa si recupera è: http://www.w3.org/2002/07/owl

I frammenti vengono elaborati dal programma utente e non hanno alcun significato o influenza sul recupero effettivo della risorsa.

+0

Ben avvistato. Credo che il mio problema ora sia con il W3C che utilizza i frammenti come identificatori univoci quando si fa riferimento a elementi di ontologia. (I campioni che ho usato erano coerenti con la loro documentazione OWL). Saluti. – Adrian

+1

@Adrian: Uri non è una classe sigillata. Potresti ottenere ciò derivando la tua classe da Uri che modifica il comportamento di Uguale per guardare anche il frammento. –

0

Immagino perché 2 URI identici a parte il frammento si riferiscono ancora alla stessa risorsa, solo una posizione diversa all'interno della risorsa.

Quindi se stai ponendo la domanda 'sono queste la stessa risorsa?' allora potresti obiettare che è corretto ignorare il frammento.

+0

Ecco un collegamento alla descrizione W3C dei frammenti negli URL: http://www.w3.org/TR/WD-html40-970708/htmlweb.html#h-4.1.1 –

+0

Riesco a vedere la logica di base. Ma una volta specificato un frammento, non stai specificando solo una parte della risorsa (ad esempio il frammento). Per esempio. http: // me/body # leftHand contro http: // me/body # rightFoot. – Adrian

+0

@Adrian: l'intera user deve comunque essere richiamata dall'agente utente e quindi il frammento può essere elaborato per indirizzare l'UA alla sezione/frammento appropriato della risorsa completa. Non c'è modo di recuperare solo parte della risorsa. –

Problemi correlati