仅迭代集合中的一部分元素

时间:2013-12-18 06:36:16

标签: c# set

我想迭代集合中的某些元素,而不必每次都修改集合或创建新集合。对于上下文,这适用于游戏。

假设屏幕上有一组实体S = {A,B,C,D}。 每个实体都会以某种方式影响其他实体。因此,A将影响集合S中的所有实体,除了它自己。

由于所有实体共享相同的集合,我不想为所有实体创建一个新集合,这只缺少实体本身。更重要的是,我希望某些实体不会影响其他特定实体。这些实体将包含在该实体的排除集中(例如:B的排除集= {D},因此,B将影响{A,C}。

我宁愿不在每次迭代时检查该元素是否存在于排除集中,并且在循环之前从公共集中删除每个实体并再次添加它们似乎是错误的。另外,另一个显而易见的事情是让每个实体都拥有一组迭代器(不包括它自己和任何被排除的实体),但它看起来很糟糕,因为大多数实体的集合几乎与公共集合完全相同,当在屏幕上添加和删除实体时,我必须同步所有这些集合。更不用说当屏幕上有10,000个实体时,这就是很多额外的设置。也许我在考虑这里的空间/时间成本,但我觉得有一种更优雅的方式可以解决这个问题。

2 个答案:

答案 0 :(得分:0)

我不完全确定这是你想要的但是怎么样

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

正如Marcin已经提到过的,这只会参考。因此,据我所知,这里的实际开销是来自LINQ迭代。

当然,集合的类型会有所不同,比较条款也可能需要改变。

答案 1 :(得分:0)

您希望能够对集合中的所有元素执行一些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中的正确元素。