按升序和降序对链表进行排序

时间:2014-08-15 01:00:28

标签: c# sorting linked-list

我有一个通用的链表,当前由int组成,我想默认按升序对它们进行排序,然后切换一个布尔值,按降序值对它们进行排序。我该怎么做呢?

2 个答案:

答案 0 :(得分:3)

假设您的链接列表实现了IEnumerable<T>(它可能应该!),您可以使用LINQ函数OrderByOrderByDescending

对于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);
}