问题标签 [custom-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.
ios - 具有不同单元格大小的 UICollectionView
我的目标是创建一个UICollectionView
如下所示的布局。
在不创建自定义的情况下这可能UICollectionViewLayout
吗?
c# - 如何将 ObservableCollection 转换为包装器集合以跟踪更改?
我认为这是一个相当简单的问题,但我仍然无法找到更好的解决方案。所以在研究了这个问题之后,我想在这里问这个问题以获得专家意见。
基本上,我正在研究 WPF 应用程序,并且我已经定义了GenericObserableCollection<T>
实现ObservableCollection<T>
,并且大多数集合都实现了它,以便在整个项目中采用标准方法。
最初,一切都很好,但后来当实体框架出现时,我不得不彻底改变域设计,因为 EF 需要公开ICollection<T>
映射。那时,我很困惑保持最小的变化并适应 EF,因为我是新手。
后来经过研究,我遇到了一些处理这种情况的好文章。
我在我的应用程序域中应用了相同的方法来创建ChildrenStorage
作为ICollection<GenericRule>
EF 的要求。
现在我正在寻找一种聪明而优雅的方法来保持我的两个集合,即在添加和/或删除项目时ChildrenStorage
与集合同步。Children
由于Children
collection 将通过 UI 进行修改,因此我想跟踪对所做的任何更改Children
并希望同步ChildrenStorage
。
c# - c# XML反序列化
又拔了我的头发。我整天都在看这个,无法弄清楚它是否可能,或者我做错了什么。
我创建了一个自定义对象集合。
然后我有一个事情:
Fields 对象继承自 ObjectCollection:
最后我有一个包含大量属性的字段类:
这似乎可行的唯一方法是,如果我像这样创建我的字段类:
我讨厌。必须访问它,例如 Thing.Fields.Items.Add 而不是 Thing.Fields.Add。对我来说没有意义。
XML 是这样的:
当我尝试反序列化它时,我只得到一个默认字段,即它添加到 objectcollection 但只有一个项目,并且它显然未能将该字段反序列化为它基本上是空的。
我试图看看我是否能弄清楚哪些属性可能会有所帮助,但我不确定。我还研究了创建自定义反序列化,但这似乎有点矫枉过正。
谁能帮我指出正确的方向。我只想要一个整洁的解决方案 - 复杂性最少!!!就像我们一样:-)
在我跳下当地码头之前,任何帮助将不胜感激。
干杯,
斯图。
excel - x64 自定义类上的 For Each 枚举错误
几个月前我在 VBA 中发现了一个错误,但找不到合适的解决方法。这个错误真的很烦人,因为它限制了一个很好的语言功能。
使用自定义集合类时,希望有一个枚举器以便可以在For Each
循环中使用该类是很常见的。这可以通过添加以下行来完成:
在函数/属性签名行之后立即通过:
- 导出类模块,在文本编辑器中编辑内容,然后重新导入
- 在函数签名上方使用Rubberduck注解
'@Enumerator
,然后进行同步
不幸的是,在 x64 上,使用上述特性会导致写入错误的内存,并在某些情况下导致应用程序崩溃(稍后讨论)。
重现错误
CustomCollection
班级:
标准模块中的代码:
通过运行该Main
方法,代码将停在Assert
该方法的行上ShowBug
,您可以在Locals窗口中看到,局部变量的值不知从何处发生了变化:
其中 ptr1 等于. 方法中使用的变量越多(包括可选参数),方法中的 ptrs 越多,写入的值(内存地址)就越多。
ObjPtr(c)
NewEnum
ShowBug
不用说,删除方法中的本地ptr变量ShowBug
肯定会导致应用程序崩溃。
逐行单步执行代码时,不会出现此错误!
更多关于这个错误
该错误与实际Collection
存储在CustomCollection
. 调用 NewEnum 函数后立即写入内存。因此,基本上执行以下任何操作都无济于事(经过测试):
- 添加
Optional
参数 - 从函数中删除所有代码(参见下面的代码)
- 声明为
IUnknown
而不是IEnumVariant
- 而不是
Function
声明为Property Get
- 在方法签名中使用类似
Friend
or的关键字Static
- 将 DISPID_NEWENUM 添加到 Get 的Let或Set对应项,甚至隐藏前者(即,将 Let/Set 设为私有)。
让我们尝试上面提到的第 2 步。如果CustomCollection
变成:
并且用于测试的代码更改为:
运行Main
会产生相同的错误。
解决方法
我发现避免该错误的可靠方法:
调用一个方法(基本上是离开
ShowBug
方法)然后回来。这需要在For Each
执行该行之前发生(之前意味着它可以在同一方法中的任何位置,不一定是之前的确切行):缺点:容易忘记
做一个
Set
声明。它可能在循环中使用的变体上(如果没有使用其他对象)。与上面的第 1 点一样,这需要在For Each
执行该行之前发生:甚至通过使用
Set c = c
Or 将集合设置为自身,将c参数传递ByVal
给ShowBug
方法(作为 Set,调用 IUnknown::AddRef)
缺点:容易忘记使用一个单独的
EnumHelper
类,它是唯一用于枚举的类:CustomCollection
会成为:和调用代码:
显然,保留的 DISPID 已从
CustomCollection
类中删除。优点:强制
For Each
on.NewEnum
函数而不是直接自定义集合。这避免了由错误引起的任何崩溃。缺点:总是需要额外的
EnumHelper
课程。很容易忘记在行中添加.NewEnum
(For Each
只会触发运行时错误)。
最后一种方法(3)之所以有效,是因为在c.NewEnum
执行该ShowBug
方法时退出,然后在调用类Property Get EnumVariant
内部之前返回EnumHelper
。基本上方法(1)是避免错误的方法。
这种行为的解释是什么?能否以更优雅的方式避免此错误?
编辑
通过CustomCollection
ByVal 并不总是一种选择。考虑一个Class1
:
现在是一个调用例程:
显然,这个例子有点勉强,但是有一个包含“子”对象的自定义集合的“父”对象是很常见的,并且“父”可能想要执行一些涉及部分或全部“子”的操作。
在这种情况下,很容易忘记在行Set
前执行语句或方法调用For Each
。
python - Prometheus 计数器未在自定义收集器中产生
我正在写这个客户收集器,我想在其中添加一个计数器。
但是我在 yield 时遇到了错误