可枚举范围降序排列

Enumerable range in descending order

我正在使用 enumerable.range() 绑定一个组合框,它工作正常。 现在我想按降序显示结果,我该怎么做?

  cboYearList.ItemsSource = Enumerable.Range( DateTime.Today.Year,1950).ToList().OrderByDescending();

您可以 Reverse 创建列表后 Enumerable.Range:

cboYearList.ItemsSource = Enumerable.Range(DateTime.Today.Year, 1950).Reverse().ToList();

或者如果你想保留你的OrderByDescending,你需要传递一个键选择器(最后的i => i):

cboYearList.ItemsSource = Enumerable.Range( DateTime.Today.Year,1950).OrderByDescending(i => i).ToList();

我写了一个可以应用于 ValueTuple<int,int> 的扩展方法,如果您的语言版本已经支持它们,我认为这是最容易使用的方法。在您的示例中,将像这样使用:

cboYearList.ItemsSource = (DateTime.Today.Year, 1950).EnumerateInclusive().ToList();
cboYearList.ItemsSource = (1950, DateTime.Today.Year).EnumerateInclusive().ToList(); //reverse

我实现了这样的扩展方法。只需将它放在您的命名空间中的静态 class 中即可。

/// <summary>
/// Enumerates all values between the first and second value in range. 
/// Automatically handles the enumeration-direction.
/// </summary>
/// <param name="range">The first parameter specifies the first value of the enumeration, 
/// the second parameter specifies the last value of the enumeration.</param>
public static IEnumerable<int> EnumerateInclusive(this (int start, int end) range)
{
    if (range.start <= range.end)
        for (int i = range.start; i <= range.end; i++)
            yield return i;
    else
        for (int i = range.start; i >= range.end; i--)
            yield return i;
}

选择的名称很明显,开始和结束都包含在枚举中。它的优点是支持双向迭代,而 Enumerable.Range 只迭代升序。如果您需要以较旧的语言版本为目标,您可以在没有 ValueTuples 的情况下轻松完成,但我喜欢这种简洁明了的方式,而无需记住 class 名称。