2009-09-07 14 views
5

Próbuję utrzymać kolekcję obiektów na podstawie ich URI:Dlaczego fragmenty URI są ignorowane w metodzie równości?

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

Jednak URI regularnie tylko różni się w oparciu o fragment Uri. Więc, co następuje powoduje błąd:

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.

jestem pogodzony konieczności włamywania się wokół tego. Ale dlaczego zachowuje się w ten sposób? Widzę logikę dla informacji o użytkowniku, ale nie dla fragmentu.

+0

Każda z frameworków RDF, z którymi pracowałem, musiała implementować własną klasę Uri, ponieważ implementacja systemu .NET System.Uri nie zapewnia zachowania oryginalnego Uri. Możesz użyć System.Uri.OriginalString, aby uniknąć tego na mniejszym projekcie ... podobne problemy będą jednak pojawiać się w kółko. –

Odpowiedz

9

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

Nacisk dodana jest moje i jest powodem fragment nie jest uważane w realizacji Uri.Equals.

W przykładzie URI zasobu jesteś odzyskiwaniem jest: http://www.w3.org/2002/07/owl

Fragmenty są przetwarzane przez agenta użytkownika i nie mają znaczenia ani wpływu na faktyczne pobieranie zasobu.

+0

Ładnie zauważył. Wydaje mi się, że moim problemem jest teraz użycie W3C fragmentów jako unikalnych identyfikatorów podczas odwoływania się do elementów ontologii. (Próbki, których użyłem były zgodne z ich dokumentacją OWL). Twoje zdrowie. – Adrian

+1

@Adrian: Uri nie jest zapieczętowaną klasą. Można to osiągnąć, wyprowadzając własną klasę z Uri, która modyfikuje zachowanie równe, aby spojrzeć na fragment. –

0

Zgaduję, ponieważ 2 identyfikatory URI, które są identyczne oprócz fragmentu, nadal odnoszą się do tego samego zasobu, tylko do innej lokalizacji w obrębie zasobu.

Więc jeśli zadajesz pytanie "czy to ten sam zasób?" wtedy możesz argumentować, że słuszne jest zignorowanie tego fragmentu.

+0

Oto link do opisu fragmentów W3C w adresach URL: http://www.w3.org/TR/WD-html40-970708/htmlweb.html#h-4.1.1 –

+0

Widzę podstawową logikę. Ale po określeniu fragmentu nie określasz tylko części zasobu (to znaczy fragmentu). Na przykład. http: // me/body # leftHand kontra http: // me/body # rightFoot. – Adrian

+0

@Adrian: Cały zasób musi zostać pobrany przez program użytkownika, a następnie fragment może zostać przetworzony, aby wskazać UA odpowiedniej sekcji/fragmentowi pełnego zasobu. Nie ma sposobu na odzyskanie tylko części zasobu. –

Powiązane problemy