C#SynchronizedReadOnlyCollection <t> .Contains(T,IEqualityComparer <t>)

时间:2015-08-28 13:45:53

标签: c# contains iequalitycomparer

我打电话的时候:

SynchronizedReadOnlyCollection<T>.Contains ( T, IEqualityComparer<T> )

无法致电:

IEqualityComparer<T>.Equals(T x, T y)

我这里有示例代码:

https://github.com/user7251/repo1/blob/master/SynchReadOnlyList_Demo/SynchReadOnlyList_Demo/SynchronizedReadOnlyCollection_Demo.cs

执行此行:

bool r = _order.Products.Contains ( p, Product.s_ProductByNameEqualityComparer );

所以它应该执行这一行:

Console.Out.WriteLine ( string.Concat ( "ProductByNameEqualityComparer.Equals(){", x.Name, "}{", y.Name, "}" ) );

但它没有向控制台写任何内容。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您的代码存在两个问题:

  1. SynchronizedReadOnlyCollection<T>的单个参数构造函数采用syncRoot object,而不是基础集合,请查看构造函数here周围的文档。

    < / LI>
  2. 与其他只读集合包装器不同,SynchronizedReadOnlyCollection<T>还会获取所提供集合的快照,而不是保留对底层集合的引用,这可以在源代码{{3}中看到}。

  3. 说实话,我无法想象曾经使用SynchronizedReadOnlyCollection<T>,如果它保留了对底层集合的引用它可能有一些用处,但是因为它需要一个快照,它对我来说似乎100%无用,为什么要锁定只能从中读取的资源?那个甚至没有实现IReadOnlyCollection<T>的事实,我不打算尝试使用它。

    在从这种类型派生并使用Items属性来改变底层集合时,可能有一个用例,但是我没有看到这样做的例子。

答案 1 :(得分:0)

Order.Products中没有任何内容。您可以将项目添加到内部_products列表,但不会更改_productsSol

_productsSol = new SynchronizedReadOnlyCollection<Product> ( _products );}使用_products的当前内容创建一个新的只读集合,该内容为空。 _products更改时,它不会更新其内容。如果确实如此,它将不是一个只读集合。