更好的可枚举性.升序和降序的范围

本文关键字:降序 范围 升序 枚举 更好 | 更新日期: 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();