问题标签 [readonly-collection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
93 浏览

c# - CollectionViewSource 过滤器不适用于 ReadOnlyCollection

我设置了一个 ItemsControl,其中项目源设置为 List。然后,我使用如下代码过滤此 ItemsControl:

这按预期工作。但是,我已经将项目源更改为 ReadOnlyCollection。这些项目仍显示在我的 ItemsControl 中,但不再应用过滤器。

将 Items 源更改回 List 会恢复过滤器功能。这是预期的行为吗?如何使用带有 ReadOnlyCollection 的过滤器作为项目源?

0 投票
2 回答
264 浏览

c# - c# - 如何计算 ReadOnlyCollection 字段中字符串的出现次数

我有一个来自 Microsoft.Clm.Shared.Smartcards 命名空间的 Smartcard 类型的 ReadOnlyCollection。

智能卡对象的字段/参数之一是 AssingnedUserName。

我需要能够计算列表中存在多少次具有相同用户名的智能卡

就像是:

我尝试使用 ReadOnlyCollection.Tolist() 方法,但找不到正确的语法来使其工作。

我还发现了许多示例,但不是 ReadOnlyCollection 对象!

实现这一目标的最佳做法是什么?

谢谢

大卫。

0 投票
0 回答
488 浏览

c# - 为什么没有字典实现 IReadOnlyDictionary?

我注意到Dictionary 类的实现IDictionary<TKey, TValue>IReadOnlyDictionary<TKey, TValue>.

但是IDictionary 接口没有实现IReadOnlyDictionary<TKey, TValue>

这意味着如果我的类有一个IDictionary<TKey, TValue>, 并且我需要传递一个IReadOnlyDictionary<TKey, TValue>我应该为此创建一个适配器,或者使用不同的解决方法。

恕我直言,每个具有 an 功能的类IDictionary<TKey, TValue>也具有 an 的功能IReadOnlyDictionary<TKey, TValue>

他们是否只是忘记实现它,或者是否有真正有意义的类实现IDictionary<TKey, TValue>了无法有意义的实现IReadOnlyDictionary<TKey, TValue>

0 投票
2 回答
1052 浏览

c# - C# IReadOnlyList保护立即被沮丧颠覆,还是我错过了什么?

鉴于以下情况:如果 IReadOnly(of T) 是从现存的 MutableEquivalent(of T) 构想出来的,那么简单地转换为可变版本允许完全访问,并且更改其他人可能依赖的对象静态元素/计数?下面的输出显示了我的“第三次注入”字符串,尽管迭代了一个只读集合。仅仅是礼貌和自我控制禁止了只读集合吗?您是否应该看到提供的接口,并承担其限制,强制转换,仅由于类型?感谢您对这个接口和其他喜欢它的真正承诺/保证的任何澄清。

编辑-这不是 IReadOnlyCollection<T>与 List.AsReadOnly() 的重复,因为我在我的问题中没有提到 List.AsReadOnly(),也没有提到 IReadOnlyCollection。这些是由响应者介绍的。这是一个关于 IReadOnly 接口后面的潜在可变列表暴露的问题。一些评论中有一些重叠,但是诸如“IReadOnly 对其底层可变列表(T)实际上做了什么?”之类的问题。重复了我的问题的精神。不是“这两个与只读有关的实体有什么区别?”,因为我只提到了一个。

0 投票
2 回答
262 浏览

c# - 迭代时修改 Collection 底层的 ReadOnlyCollection 属性

我有以下财产:

在我循环的另一堂课中LoadedAssemblies

在遍历程序集时,底层集合 ( _loadedAssemblies) 有时会发生变化,这会给出一个System.InvalidOperationException. LoadedAssemblies确保安全的首选方法是什么?我无法重现该问题,所以我不能只是尝试。

可以吗?

编辑

0 投票
1 回答
531 浏览

c# - Fluent NHibernate 正确映射基类中的只读属性

我想为我的一些实体创建一个基类,因为它们都共享一个Event列表属性。我还想让Event列表成为只读属性

所以我创建了一个基EventRelatedEntity类,然后在与事件有关的每个实体类上派生它。

另请注意,EventRelatedEntity该类没有 NHibernate 映射类,因为它没有链接到表。

请参阅下面的代码。

基类:

实体类

Fluent NHibernate 实体映射类

最后,我想避免直接访问该List<>.Add()方法。我想要一个只读集合。向实体的事件列表添加新的唯一方法Event必须是AddEvent相应实体类的方法。

例子:

问题是当我这样做时:

我从 NHibernate 收到一个错误:

无法将 'NHibernate.Collection.Generic.PersistentGenericBag'1 [SolutionDOC_Interface.Entity.Event]' 类型的对象转换为 'System.Collections.Generic.List'1 [SolutionDOC_Interface.Entity.Event]' 类型。

我认为这与EventRelatedEntity该类没有 NHibernate 映射的事实有关,但我无法提供映射,因为它与 DB 中的表无关。也许如果我在每个类(公司、文档等)中声明事件列表而不使用继承,NHibernate 将起作用,但这种方法会产生很多我想避免的代码重复。

更新 2017/10/18

像@ryan 建议的那样更改代码后,现在它可以工作了。

修改后的代码:

0 投票
4 回答
221 浏览

c# - 将收藏项设为只读

我有一个业务实体如下,

我的业务逻辑要求,一旦Class2使用该方法将实例添加到列表AddClass顶部,任何人都不应编辑先前添加到列表中的实例的属性,只能编辑列表中的最后一项。我该怎么做呢?ClassesClass1Class2

我已经尝试过 IReadOnlyList,但它似乎与使列表结构本身不可编辑而不会阻止对其项目内容的编辑有关。

0 投票
1 回答
4819 浏览

c# - 使用 ReadOnlyCollection与列表返回类型的 vs 数组

前段时间我发了一个类似的关于参数的问题,它提到了一篇与这个问题更相关的文章,它主张使用IReadOnlyCollection<T>over IEnumerable<T>

最近一直在考虑回国的利弊 IEnumerable<T>

从好的方面来说,它几乎与接口一样小,因此它为方法作者提供了比提交更重的替代方案(如IList<T>或(天堂禁止)数组)更大的灵活性。

但是,正如我在一篇文章中概述的那样,IEnumerable<T>返回会诱使调用者违反Liskov 替换原则。他们太容易使用 LINQ 扩展方法,如Last()and Count(),其语义IEnumerable<T>不承诺。

需要一种更好的方法来锁定退回的收藏品,而不会使这种诱惑如此突出。(我想起了巴尼·法夫(Barney Fife)艰难地学习这一课。)

输入IReadOnlyCollection<T>.NET 4.5 中的新功能。它只向IEnumerable<T>:属性添加了一个Count属性。通过承诺计数,您可以向呼叫者保证您IEnumerable<T>确实有一个终点站。然后他们可以Last()问心无愧地使用 LINQ 扩展方法。

但是,本文主张ReadOnlyCollection<T>在您想要保护成员的情况下使用(和其他替代方法)。

所以,我和同事讨论过这个问题,我们有不同的看法。

他建议一个方法应该返回它所拥有的任何东西(例如一个List<T>或数组),如果该方法产生它并且调用者之后更改它不会对其他任何东西产生影响(即,它不是成员并且不属于任何生命周期大于方法调用)。

我的观点是ReadOnlyCollection<T>向调用者表明集合通常应该保持原样。如果他们想更改它,那么他们有责任将其显式转换为 aIList<T>或调用ToList它。

Microsoft 指南特别指出:

一般来说,更喜欢ReadOnlyCollection<T>.

Collection<T>但除了说明用于返回读/写集合之外,它似乎没有定义一般情况。但是我的同事是否认为消费者可能想要添加到集合中并且我们不在乎他们是否为返回读/写集合进行了定义?

编辑

在回答一些回复时,为了尝试为我的问题添加更多上下文,我在下面放置了一些代码,演示了各种场景以及与我的问题相关的评论:

所以用一个例子来说明这个困境,如果我们采用GetMemberArrayAsIs,ReSharper 告诉我将返回类型更改为IEnumerable<T>如果调用代码只枚举返回值一次。如果我多次枚举返回的值,那么我必须保持原样以避免可能的多次枚举警告。但是,这就是我的问题所在。我是否应该返回ReadOnlyCollection<T>以遵守我对 Microsoft 指南的理解,而不是返回数组?这将要求我实例化 a ReadOnlyCollection<T>,如GetMemberArrayAsReadOnlyCollection. 或者,我们是否应该像我的同事认为的那样返回数组(GetMemberArrayAsIs)?

或者,我可以坚持返回IEnumerable<T>并让调用者有责任在多次使用集合之前进行枚举,但我认为微软的偏好ReadOnlyCollection<T>是为了避免这种情况。

在 a 的情况下List<T>,困境稍微复杂一些,因为它有可能被更改,如果它是成员,这是一个问题。在这种情况下,我当然应该返回ReadOnlyCollection<T>( GetMemberListAsReadOnlyCollection)。但是对于本地列表,我是否应该返回ReadOnlyCollection<T>以遵守我对 Microsoft 指南的理解?这将要求我实例化 a ReadOnlyCollection<T>,如GetLocalListAsReadOnlyCollection. 或者,我们是否应该像我的同事认为的那样返回列表(GetMemberListAsIs)?

我希望这为这个问题增加了更多的背景,并且在某些方面它是相当哲学的。但其中很多是关于应该如何解释微软指南,以及是否应该让提供者有责任转换为ReadOnlyCollection<T>,或者让消费者在多次使用之前枚举返回的值(使用ToArray),或者实际上两者都不和原样返回。

0 投票
1 回答
1100 浏览

c# - C# 转换 ReadOnlyCollection到字节 [] 数组

给定一个只读的整数集合,如何将其转换为字节数组?

将 'collection' 转换为 byte[] 的优雅方法是什么?

0 投票
2 回答
88 浏览

java - List.of() — 为什么要提供一个无法添加/删除/编辑的空元素列表?

我测试过的 Java 9 功能之一是List.of()创建不可修改的列表。我想知道 - 如果它返回一个无法添加/删除/编辑的元素的空列表,那么这个方法的目的是什么?

我唯一能想到的就是将此列表与另一个空列表进行比较,但是为什么不直接使用someList.isEmpty()呢?