代码之家  ›  专栏  ›  技术社区  ›  Adrian

为什么在Equals方法中忽略Uri的Fragment?

  •  7
  • Adrian  · 技术社区  · 17 年前

    我试图根据对象的URI维护一组对象:

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

    不考虑用户的实例 http://www.contoso.com/index.htm#search 和 http://user:password@www.contoso.com/index.htm , Equals方法将返回true。

    我接受了不得不破解这个问题。但它为什么会这样呢?我可以看到用户信息的逻辑,但无法看到片段的逻辑。

    2 回复  |  直到 17 年前
        1
  •  9
  •   Scott Dorman    17 年前

    自 RFC 2396 :

    4.1.片段标识符

    当使用URI引用对标识的资源执行检索操作时,可选的片段标识符由交叉线(“#”)字符与URI分隔,由用户代理在以下情况下解释的附加引用信息组成 检索操作已成功完成。 因此,它不是URI的一部分,但通常与URI结合使用。

    添加的重点是我的,也是Uri.Equals实现中不考虑该片段的原因。

    在您的示例中,您正在检索的资源的URI是: http://www.w3.org/2002/07/owl

        2
  •  0
  •   Luke Sampson    17 年前

    所以,如果你问的是“这些是同一种资源吗?那么你可以说忽略这个片段是正确的。