可数范围按降序排列

时间:2015-03-02 03:32:31

标签: c# wpf linq enumerable

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

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

2 个答案:

答案 0 :(得分:10)

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

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();

答案 1 :(得分:0)

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

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

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

/// <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.end; i >= range.start; i--)
            yield return i;
}

选择名称是为了清楚地将开始和结束都包含在枚举中。与仅递增迭代的 Enumerable.Range 相比,它具有支持双向迭代的优点。如果您需要针对较旧的语言版本,无需 ValueTuples 也可以轻松完成,但我喜欢这种简洁明了的方式,而无需记住类名。