我有一个通用的链表,当前由int组成,我想默认按升序对它们进行排序,然后切换一个布尔值,按降序值对它们进行排序。我该怎么做呢?
答案 0 :(得分:3)
假设您的链接列表实现了IEnumerable<T>
(它可能应该!),您可以使用LINQ函数OrderBy
和OrderByDescending
。
对于int,默认比较器没问题,所以你只需写:
bool ascending = true;
var orderedEnumerable = ascending ? collection.OrderBy(x => x) : collection.OrderByDescending(x => x);
或者,使用函数和默认args:
IOrderedEnumerable<int> GetOrderedNumbers(bool ascending = true)
{
return ascending ? collection.OrderBy(x => x) : collection.OrderByDescending(x => x);
}
订单的MSDN:http://msdn.microsoft.com/en-us/library/vstudio/bb534966(v=vs.100).aspx
答案 1 :(得分:0)
如果你使用.NET的LinkedList<T>
,那么实施IEnumerable<T>
你可以使用其中一些解决方案:
此扩展方法返回类型为LinkedList<T>
public static LinkedList<TSource> SortedAscending<TSource, TKey>(
this LinkedList<TSource> source,
Func<TSource, TKey> keySelector)
{
LinkedList<TSource> tempLinkedList = new LinkedList<TSource>();
IEnumerable<TSource> orderedEnumerable = source.OrderBy(keySelector).AsEnumerable();
orderedEnumerable.ForEach(value => tempLinkedList.AddLast(value));
return tempLinkedList;
}
此扩展方法对类型LinkedList<T>
public static void SelfSortAscending<TSource, TKey>(
this LinkedList<TSource> source,
Func<TSource, TKey> keySelector)
{
LinkedList<TSource> tempLinkedList = new LinkedList<TSource>(source);
source.Clear();
IEnumerable<TSource> orderedEnumerable = tempLinkedList.OrderBy(keySelector).AsEnumerable();
orderedEnumerable.ForEach(value => source.AddLast(value));
}
降序排序的扩展方法,您可以在以下位置找到: LinkedListHelper (GitHub link)
顺便说一下,.ForEach()
你可以像这样实现:
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
if (action == null)
throw new ArgumentNullException(nameof(action));
foreach (T element in source)
action(element);
}