/// <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;
もし(リスト== nullの|| list.Count == 0)
リターン合計。
//合計
小数12月= decimal.Zero。
foreachの(リストにおけるT OBJ)
{
(obj.GetType()GetPropertyメソッド(プロパティ名)ヌル以降.getvalue(OBJ)== NULLの)場合
続けます。
IF(、)12アウトヌルdecimal.TryParse(obj.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ).ToString())
の和+ = 12月;
}
合計を返します。
}
/// <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));
一覧<オブジェクト> sortlistがあり=新しいリスト<オブジェクト>();
foreachの(リストにおけるT OBJ)
sortList.Add(OBJ)。
sortList.Sort(CombineObject(propertyNameの、sortDirection))。
一方、(list.Count> 0)
list.RemoveAt(0)。
foreachの(sortlistがTでのOBJ)
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));
一覧<オブジェクト> sortlistがあり=新しいリスト<オブジェクト>();
foreachの(リストにおけるT OBJ)
sortList.Add(OBJ)。
sortList.Sort(CombineObject(sortParas))。
一方、(list.Count> 0)
list.RemoveAt(0)。
foreachの(sortlistがTでのOBJ)
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;
()obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL!= nullの場合
&& obj2.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2)、NULL!= NULL)
{
IF(obj1.GetType ().GetProperty(プロパティ名)以降.getvalue(OBJ1、NULL)IComparableをある)
{
RET =((IComparableを)obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL))
.CompareTo(obj2.GetType() .GetProperty(プロパティ名)以降.getvalue(OBJ2、NULL))。
}
他
{
RET = obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL).ToString()
.CompareTo(obj2.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2、NULL).ToString())。
}
}
そうであれば(obj1.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1、NULL)== NULL
&& obj2.GetType()。GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2、NULL)== NULL)
{
RET = 0;
}
そうであれば(obj1.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ1)、ヌル== NULL)
{
RET = -1。
}
そうであれば(obj2.GetType()GetPropertyメソッド(プロパティ名)以降.getvalue(OBJ2、NULL)== NULL)
{
RET = 1。
}
もし(SortDirection.Desc.Equals(sortDirection))
リターンRET * -1;
他の
リターンRET;
}
}
ます。https://my.oschina.net/cjkall/blog/195882で再現