/// <summary>
/// Listに関するユーティリティクラス。
/// </summary>
public class ListUtil
{
/// <summary>
/// 昇順・降順
/// </summary>
public enum SortDirection { Asc = 1, Desc = 2 };
/// <summary>
/// 指定されたプロパティーで合計する
/// </summary>
/// <param name="propertyName">プロパティー名</param>
public static decimal Total<T>(IList<T> list, string propertyName)
{
decimal sum = decimal.Zero;
if (list == null || list.Count == 0)
return sum;
// 合計
decimal dec = decimal.Zero;
foreach (T obj in list)
{
if (obj.GetType().GetProperty(propertyName).GetValue(obj, null) == null)
continue;
if (decimal.TryParse(obj.GetType().GetProperty(propertyName).GetValue(obj, null).ToString(), out dec))
sum += dec;
}
return sum;
}
/// <summary>
/// 指定されたプロパティーでソートする
/// </summary>
/// <param name="propertyName">プロパティー名</param>
/// <param name="sortDirection">ソート昇順・降順</param>
public static void Sort<T>(IList<T> list, string propertyName, SortDirection sortDirection)
{
// アイテムが存在しなければ、ソースしない
if (list.Count == 0)
return;
// ソート
//list.Sort(CombineObject(propertyName, sortDirection));
List<object> sortList = new List<object>();
foreach (T obj in list)
sortList.Add(obj);
sortList.Sort(CombineObject(propertyName, sortDirection));
while (list.Count > 0)
list.RemoveAt(0);
foreach (T obj in sortList)
list.Add(obj);
}
/// <summary>
/// 指定されたプロパティーでソートする
/// </summary>
/// <param name="sortParas"></param>
public static void Sort<T>(IList<T> list, Dictionary<string, SortDirection> sortParas)
{
// アイテムが存在しなければ、ソースしない
if (list.Count == 0)
return;
// ソート
//list.Sort(CombineObject(sortParas));
List<object> sortList = new List<object>();
foreach (T obj in list)
sortList.Add(obj);
sortList.Sort(CombineObject(sortParas));
while (list.Count > 0)
list.RemoveAt(0);
foreach (T obj in sortList)
list.Add(obj);
}
/// <summary>指定した比較メソッドを結合したデリゲートを返す。</summary>
/// <param name="sortParas"></param>
/// <returns>デリゲート</returns>
private static Comparison<object> CombineObject(string propertyName, SortDirection sortDirection)
{
return delegate(object x, object y)
{
return CompareColumn(x, y, propertyName, sortDirection);
};
}
/// <summary>指定した比較メソッドを結合したデリゲートを返す。</summary>
/// <param name="sortParas"></param>
/// <returns>デリゲート</returns>
private static Comparison<object> CombineObject(Dictionary<string, SortDirection> sortParas)
{
return delegate(object x, object y)
{
int p = 0;
foreach (string propertyName in sortParas.Keys)
{
p = CompareColumn(x, y, propertyName, sortParas[propertyName]);
if (p != 0)
break;
}
return p;
};
}
/// <summary>指定されたプロパティの値で比較する。</summary>
/// <param name="obj1">オブジェクト</param>
/// <param name="obj2">オブジェクト</param>
/// <param name="propertyName"></param>
/// <param name="sortDirection"></param>
/// <returns>
/// 同じ場合、0を返す。
/// obj1の指定されたプロパティの値が大きい場合、0より大きい値を返す。
/// obj2の指定されたプロパティの値が大きい場合、0より小さい値を返す。
/// (SortOrder.Descendingの場合、*-1で戻す)
/// </returns>
private static int CompareColumn(object obj1, object obj2, string propertyName, SortDirection sortDirection)
{
int ret = 0;
if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) != null
&& obj2.GetType().GetProperty(propertyName).GetValue(obj2, null) != null)
{
if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) is IComparable)
{
ret = ((IComparable)obj1.GetType().GetProperty(propertyName).GetValue(obj1, null))
.CompareTo(obj2.GetType().GetProperty(propertyName).GetValue(obj2, null));
}
else
{
ret = obj1.GetType().GetProperty(propertyName).GetValue(obj1, null).ToString()
.CompareTo(obj2.GetType().GetProperty(propertyName).GetValue(obj2, null).ToString());
}
}
else if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) == null
&& obj2.GetType().GetProperty(propertyName).GetValue(obj2, null) == null)
{
ret = 0;
}
else if (obj1.GetType().GetProperty(propertyName).GetValue(obj1, null) == null)
{
ret = -1;
}
else if (obj2.GetType().GetProperty(propertyName).GetValue(obj2, null) == null)
{
ret = 1;
}
if (SortDirection.Desc.Equals(sortDirection))
return ret * -1;
else
return ret;
}
}
转载于:https://my.oschina.net/cjkall/blog/195882