【发布时间】:2011-03-30 02:25:07
【问题描述】:
我一直在寻找一些快速有效的方法来合并数组中的项目。这是我的场景。集合按发件人排序。相邻元素不一定相差 1,即最后一个 To 和下一个 From 之间可能存在间隙,但它们永远不会重叠。
var list = new List<Range>();
list.Add(new Range() { From = 0, To = 1, Category = "AB" });
list.Add(new Range() { From = 2, To = 3, Category = "AB" });
list.Add(new Range() { From = 4, To = 5, Category = "AB" });
list.Add(new Range() { From = 6, To = 8, Category = "CD" });
list.Add(new Range() { From = 9, To = 11, Category = "AB" }); // 12 is missing, this is ok
list.Add(new Range() { From = 13, To = 15, Category = "AB" });
我希望以这样的方式合并上述集合,即前三个(这个数字可以变化,从至少 2 个元素到满足条件的多个元素)元素成为一个元素。无法合并具有不同类别的元素。
new Range() { From = 0, To = 5, Category = "AB" };
这样生成的集合总共有 4 个元素。
0 - 5 AB
6 - 8 CD
9 - 11 AB // no merging here, 12 is missing
13 - 15 AB
我有一个非常大的集合,包含超过 2.000.000 项,我希望尽可能高效地完成此操作。
【问题讨论】:
-
列表是否已经以相邻范围彼此相邻且在列表中的正确顺序进行排序?
-
是的,我为此添加了 cmets。
-
我假设在您的示例中,前两个范围只能合并,因为它们具有相同的类别,并且 To 和 From 最多相差 1?如果第一个范围以 2 结尾,它们不能合并?
-
正确。缺少通知编号 12,并且元素未合并。此外,可以合并更多连续的元素,而不仅仅是 2 个。如果存在间隙(具有相同类别),则合并将停止。我在原始代码中添加了更多示例来阐明这一点。
-
我很困惑。你要求一个“尽可能高效”的解决方案,但你接受了通用的、基于委托的解决方案,这会更慢。如果您能在对我的回答的评论中解释为什么您认为它有缺陷,我会很高兴,这样我就可以为未来学习。谢谢!
标签: c# .net algorithm collections