仅迭代集合中元素的子集
本文关键字:子集 元素 迭代 集合 | 更新日期: 2024-10-30 13:51:00
我只想迭代集合中的某些元素,而不必每次都修改集合或创建新元素。对于上下文,这是针对游戏的。
假设我们在屏幕上有一组实体 S = { A, B, C, D }。每个实体都会以某种方式影响其他实体。因此,A 将影响集合 S 中的所有实体,除了它自己。
由于所有实体共享同一个集合,因此我不想为所有实体创建一个新集合,这只缺少实体本身。更重要的是,我希望某些实体不会影响其他特定实体。这些实体将包含在该实体的排除集中(例如:B 的排除集 = { D },因此,B 将影响 { A, C }。
我宁愿不在每次迭代时检查元素是否存在于排除集中,并且在循环之前从公共集中删除每个实体并再次添加它们似乎是错误的。此外,另一个明显的事情是让每个实体都持有一组要迭代的东西(不包括它自己和任何排除的实体),但这似乎又很糟糕,因为大多数实体的集合几乎与公共集合完全相同,并且当在屏幕上添加和删除实体时,我必须同步所有这些集合。更不用说当屏幕上有 10,000 个实体时,这是很多额外的集合。也许我在这里考虑了空间/时间成本,但我觉得有一种更优雅的方式来解决这个问题。
您希望能够对集合中的所有元素执行一些operation
,除了一个"acting" element
,以及代理元素exclude-list
中选定的其他一些元素,对吗?
如果这是正确的,则可以将每个元素包含在它自己的排除列表中,以及它应该排除的任何其他元素,并循环访问不在该列表中的所有元素。
伪代码简化:
var originalSet = { A, B, C, D, E }
var excludeListForA = {A, B, C} // <-- Note that A is in it's own list!
// To update D and E:
var setToActOn = originalSet.Where(element => excludeListForA.Contains(element));
只要您现在只使用引用,就应该能够更改 setToActOn
中的元素以更新 originalSet
中的正确元素。
我不完全确定这就是你所追求的,但怎么样
var masterSet = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var member = 5;
var exclusions = new List<int> { 4, 6 };
var subSet = masterSet
.Where(x => !exclusions.Any(y => x) && x == member)
.ToList(); // or not to list and do stuff with say Select or something
正如马尔钦已经提到的那样,这将只对参考文献进行操作。因此,这里真正的开销(据我所知)来自 LINQ 迭代。
当然,集合的类型会有所不同,比较条款也可能需要更改。