2011-05-10 46 views

回答

1

这使我想到的最简单的就是用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 
+0

我不确定是否我更喜欢你的答案或其他答案! – 2011-05-11 11:53:12

+0

我最终更喜欢这个答案,因为写得更快 – 2011-05-11 17:54:47

3

你可以看看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); 
    } 
} 
+1

更具体地说,我认为最有用的功能会有'合并()'。 – svick 2011-05-10 23:43:12

+0

@svick:谢谢。更新! – mellamokb 2011-05-10 23:45:59

+0

也许你的答案是最完整的,我喜欢它很多 – 2011-05-11 11:53:43

0

System.Collections.Generic.HashSet刚刚的事情:

  • UnionWith(IEnumerable<T> other)。修改当前HashSet对象以包含其本身,指定集合或两者中存在的所有元素。
  • IntersectWith(IEnumerable<T> other)。修改当前HashSet对象以仅包含该对象和指定集合中存在的元素。
1

以下是香草的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); 
+0

而且对于大范围来说效率也很低。 – mellamokb 2011-05-11 00:05:47