更好的可枚举性.升序和降序的范围
本文关键字:降序 范围 升序 枚举 更好 | 更新日期: 2023-09-27 18:27:36
假设我有两个点,int x1, x2
,其中x1
可以大于、小于或等于x2
。我想生成这两个点之间的所有整数,包括(以x1
开始,以x2
结束),或者如果两个点相等,则只生成x1
的值。有没有用这些值生成IEnumerable<int>
的优雅方法?
您可以使用以下迭代器块:
IEnumerable<int> CreateRange(int x1, int x2) {
var increment = x2 > x1 ? 1 : -1;
for (var i = x1; i != x2; i += increment)
yield return i;
yield return x2;
}
它是高效的,创建范围和使用Enumerable.Range
:一样干净
CreateRange(10, 5).Select( ... )
如果您想坚持使用单个LINQ语句-
Enumerable.Range(0, Math.Abs(x2 - x1) + 1).Select(i => x1 + i * Math.Sign(x2 - x1))
您可以这样做:
//normal order works
int x1 = 5;
int x2 = 10;
int len = Math.Abs(x2 - x1) + 1;
var range = x1 < x2 ? Enumerable.Range(x1, len) : Enumerable.Range(x2, len).Reverse();
//reverse order works (the same code for range)
x1 = 10;
x2 = 5;
len = Math.Abs(x2 - x1) + 1;
range = x1 < x2 ? Enumerable.Range(x1, len) : Enumerable.Range(x2, len).Reverse();