7

我正在尝试根据它们的 URI 维护一组对象:

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

但是,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

Equals 方法比较两个实例,而不考虑它们可能包含的用户信息 (UserInfo) 和片段 (Fragment) 部分。例如,给定 URI http://www.contoso.com/index.htm#searchhttp://user:password @www.contoso.com/index.htm ,Equals 方法将返回 true。

我已经不得不解决这个问题。但是为什么它会这样呢?我可以看到用户信息的逻辑,但看不到片段的逻辑。

4

2 回答 2

10

来自RFC 2396

4.1。片段标识符

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

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

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

这些片段由用户代理处理,对资源的实际检索没有任何意义或影响。

于 2009-09-07T02:07:55.120 回答
0

我猜是因为除了片段之外相同的 2 个 URI 仍然引用相同的资源,只是资源中的不同位置。

因此,如果您要问“这些资源是否相同?” 那么您可以争辩说忽略该片段是正确的。

于 2009-09-07T02:00:51.993 回答