我有一个在这个问题很好解释的情况的:C#实现获取范围和工会这些范围
我需要一个C#实现(集合也许),其采用列表范围(ints)并且做它们的联合。 然后,我需要遍历此集合中的所有整数(也是范围之间的数字) 是否有任何库/实现,以便我不必自行重写所有内容?
我有一个在这个问题很好解释的情况的:C#实现获取范围和工会这些范围
我需要一个C#实现(集合也许),其采用列表范围(ints)并且做它们的联合。 然后,我需要遍历此集合中的所有整数(也是范围之间的数字) 是否有任何库/实现,以便我不必自行重写所有内容?
这使我想到的最简单的就是用Enumerable.Range,然后把不同的IEnumerable与标准的linq运营商。喜欢的东西:
var list = Enumerable.Range(1, 5)
.Concat(Enumerable.Range(7, 11))
.Concat(Enumerable.Range(13, 22))
foreach(var number in list)
// Do something
很明显,你可以使用联盟和Intersect以及...显然你也可以把你的范围类似的List<IEnumerable<int>>
或东西,然后遍历生产要素的单一列表中的元素:
var ranges = new List<IEnumerable<int>>
{
Enumerable.Range(1, 5),
Enumerable.Range(7, 11),
Enumerable.Range(10, 22)
};
var unionOfRanges = Enumerable.Empty<int>();
foreach(var range in ranges)
unionOfRanges = unionOfRanges.Union(range);
foreach(var item in unionOfRanges)
// Do something
你可以看看this implementation,看看它是否符合你的需求。
合并范围与Range.Coalesce
:
var range1 = Range.Create(0, 5, "Range 1");
var range2 = Range.Create(11, 41, "Range 2");
var range3 = Range.Create(34, 50, "Range 3");
var ranges = new List<Range> { range1, range2, range3 };
var unioned = Range.Coalesce(ranges);
遍历范围与.Iterate
:
foreach (var range in unioned)
{
foreach (int i in range.Iterate(x => x + 1))
{
Debug.WriteLine(i);
}
}
System.Collections.Generic.HashSet刚刚的事情:
UnionWith(IEnumerable<T> other)
。修改当前HashSet对象以包含其本身,指定集合或两者中存在的所有元素。IntersectWith(IEnumerable<T> other)
。修改当前HashSet对象以仅包含该对象和指定集合中存在的元素。以下是香草的LINQ实现:
var r1 = Enumerable.Range(1,10);
var r2 = Enumerable.Range(20,5);
var r3 = Enumerable.Range(-5,10);
var union = r1.Union(r2).Union(r3).Distinct();
foreach(var n in union.OrderBy(n=>n))
Console.WriteLine(n);
而且对于大范围来说效率也很低。 – mellamokb 2011-05-11 00:05:47
我不确定是否我更喜欢你的答案或其他答案! – 2011-05-11 11:53:12
我最终更喜欢这个答案,因为写得更快 – 2011-05-11 17:54:47