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