可枚举范围降序排列
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 名称。
我正在使用 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 名称。