You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
5.4 KiB

using Apewer.Internals;
using System;
using System.Collections.Generic;
using System.Text;
namespace Apewer
{
/// <summary>排序实用工具。</summary>
public class SortUtility
{
#region compare
/// <exception cref="ArgumentException"></exception>
public static int Ascend<T>(T a, T b) where T : IComparable
{
if (a == null) return b == null ? 0 : b.CompareTo(a);
return b == null ? 1 : a.CompareTo(b);
}
/// <exception cref="ArgumentException"></exception>
public static int Descend<T>(T a, T b) where T : IComparable
{
return 0 - Ascend(a, b);
}
/// <exception cref="ArgumentException"></exception>
public static int AscendT<T>(T a, T b) where T : IComparable<T>
{
if (a == null) return b == null ? 0 : b.CompareTo(a);
return b == null ? 1 : a.CompareTo(b);
}
/// <exception cref="ArgumentException"></exception>
public static int DescendT<T>(T a, T b) where T : IComparable<T>
{
return 0 - AscendT(a, b);
}
#endregion
#region enumerable
/// <summary>升序排序。</summary>
public static List<T> Ascend<T>(IEnumerable<T> items) where T : IComparable
{
var list = new List<T>(items);
list.Sort(Ascend);
return list;
}
/// <summary>降序排序。</summary>
public static List<T> Descend<T>(IEnumerable<T> items) where T : IComparable
{
var list = new List<T>(items);
list.Sort(Descend);
return list;
}
/// <summary>升序排序。</summary>
public static List<T> AscendT<T>(IEnumerable<T> items) where T : IComparable<T>
{
var list = new List<T>(items);
list.Sort(AscendT);
return list;
}
/// <summary>降序排序。</summary>
public static List<T> DescendT<T>(IEnumerable<T> items) where T : IComparable<T>
{
var list = new List<T>(items);
list.Sort(DescendT);
return list;
}
#endregion
#region dictionary
/// <summary>对 Key 排序。</summary>
public static List<KeyValuePair<TKey, TValue>> Keys<TKey, TValue>(Dictionary<TKey, TValue> target, Comparison<TKey> comparison) where TKey : IComparable<TKey>
{
if (target == null) return null;
var keys = new List<TKey>();
keys.AddRange(target.Keys);
if (comparison == null) keys.Sort();
else keys.Sort(comparison);
var output = new List<KeyValuePair<TKey, TValue>>();
foreach (var key in keys) output.Add(key, target[key]);
return output;
}
/// <summary>对 Key 升序排序。</summary>
public static List<KeyValuePair<TKey, TValue>> KeysAscend<TKey, TValue>(Dictionary<TKey, TValue> target) where TKey : IComparable<TKey>
{
return Keys(target, new Comparison<TKey>(AscendT));
}
/// <summary>对 Key 升序排序。</summary>
public static List<KeyValuePair<TKey, TValue>> KeysDescend<TKey, TValue>(Dictionary<TKey, TValue> target) where TKey : IComparable<TKey>
{
return Keys(target, new Comparison<TKey>(DescendT));
}
/// <summary>对 Key 升序排序。</summary>
public static Dictionary<string, string> SortKeyAscend(Dictionary<string, string> dictionary)
{
return SortHelper.DictionaryStringString(dictionary, true, true);
}
/// <summary>对 Key 降序排序。</summary>
public static Dictionary<string, string> SortKeyDecend(Dictionary<string, string> dictionary)
{
return SortHelper.DictionaryStringString(dictionary, true, false);
}
/// <summary>对 Value 升序排序。</summary>
public static Dictionary<string, string> SortValueAscend(Dictionary<string, string> dictionary)
{
return SortHelper.DictionaryStringString(dictionary, false, true);
}
/// <summary>对 Value 降序排序。</summary>
public static Dictionary<string, string> SortValueDecend(Dictionary<string, string> dictionary)
{
return SortHelper.DictionaryStringString(dictionary, false, false);
}
/// <summary>对 Key 升序排序。</summary>
public static Dictionary<string, double> SortKeyAscend(Dictionary<string, double> dictionary)
{
return SortHelper.DictionaryStringDouble(dictionary, true, true);
}
/// <summary>对 Key 降序排序。</summary>
public static Dictionary<string, double> SortKeyDecend(Dictionary<string, double> dictionary)
{
return SortHelper.DictionaryStringDouble(dictionary, true, false);
}
/// <summary>对 Value 升序排序。</summary>
public static Dictionary<string, double> SortValueAscend(Dictionary<string, double> dictionary)
{
return SortHelper.DictionaryStringDouble(dictionary, false, true);
}
/// <summary>对 Value 降序排序。</summary>
public static Dictionary<string, double> SortValueDecend(Dictionary<string, double> dictionary)
{
return SortHelper.DictionaryStringDouble(dictionary, false, false);
}
#endregion
}
}