按降序排列的可枚举范围
Posted
技术标签:
【中文标题】按降序排列的可枚举范围【英文标题】:Enumerable range in descending order 【发布时间】:2015-05-02 08:41:12 【问题描述】:我正在使用enumerable.range()
绑定一个组合框,它工作正常。
现在我想按降序显示结果,我该怎么做?
cboYearList.ItemsSource = Enumerable.Range( DateTime.Today.Year,1950).ToList().OrderByDescending();
【问题讨论】:
您可以在设置组合框的 itemsSource 之前尝试对数据进行排序。 感谢格兰特·温尼 【参考方案1】:我编写了一个可以应用于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.start; i >= range.end; i--)
yield return i;
选择名称很明显,开始和结束都包含在枚举中。与仅迭代升序的Enumerable.Range
相比,它具有支持双向迭代的优势。如果您需要针对较旧的语言版本,您可以轻松地不使用 ValueTuples
,但我喜欢这种简洁明了的方式,无需记住类名。
【讨论】:
不错的扩展,但它不能正常工作。反向for循环应该是for (int i = range.start; i >= range.end; i--)
谢谢@Denis,我在上面修好了。原文是第 13 行中的for (int i = range.end; i >= range.start; i--)
。【参考方案2】:
创建列表后可以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();
【讨论】:
感谢支持:` int numberOfyears = DateTime.Now.Year - 1900; cboYearList.ItemsSource = Enumerable.Range(1900, numberOfyears).Reverse().ToList(); `Reverse()
的默认实现使用中间缓冲区,这可能会导致内存使用不理想。以上是关于按降序排列的可枚举范围的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Firebase 中按降序排列数据 - Python