Listソートの3つの実装方法
4090 ワード
しばらくの間gridviewを使ってgridviewで実現したソート機能に興味があり、C#が持参したソート方法である1つのフィールドしかソートできないので、今日demoでは、listをソートする方法を3つまとめ、フィールド名を動的に伝達してlistをソートします.
まず、普段よく使われるソート方法をいくつかご紹介します.
1つ目は、エンティティクラスがIComparableインタフェースを実装し、CompareToメソッドを実装する必要があることです.
エンティティークラスの定義は次のとおりです.
呼び出し方式は以下のように,sortメソッドだけでlistのソートを実現できる.
第2の方法:linq to listをソートする
linqを用いてリストのソートを実現し、エンティティクラス定義時にIComparableインタフェースを実現する必要はなく、呼び出し方式は以下の通りである.
しかし、上記の2つの方法はいずれも1つのエンティティ属性のみをソートすることができ、異なる属性をソートするとifをたくさん書くしか判断できないので、面倒でソートルールを選択することはできません.
次に、入力パラメータに基づいてソートを実現する方法を示す.
呼び出し方法:
もっといい方法があれば、みんなを歓迎して、一緒に勉強します........
まず、普段よく使われるソート方法をいくつかご紹介します.
1つ目は、エンティティクラスがIComparableインタフェースを実装し、CompareToメソッドを実装する必要があることです.
エンティティークラスの定義は次のとおりです.
class Info:IComparable
{
public int Id { get; set; }
public string Name { get; set; }
public int CompareTo(object obj) {
int result;
try
{
Info info = obj as Info;
if (this.Id > info.Id)
{
result = 0;
}
else
result = 1;
return result;
}
catch (Exception ex) { throw new Exception(ex.Message); }
}
}
呼び出し方式は以下のように,sortメソッドだけでlistのソートを実現できる.
private static void ReadAccordingCompare() {
List infoList = new List();
infoList.Add(
new Info() { Id = 1, Name = "abc" });
infoList.Add(new Info() { Id = 3, Name = "rose" });
infoList.Add(new Info() { Id = 2, Name = "woft" });
infoList.Sort();
foreach (var item in infoList)
{
Console.WriteLine(item.Id + ":" + item.Name);
}
}
第2の方法:linq to listをソートする
linqを用いてリストのソートを実現し、エンティティクラス定義時にIComparableインタフェースを実現する必要はなく、呼び出し方式は以下の通りである.
private static void ReadT(string str) {
List infoList = new List();
infoList.Add(
new Info() { Id = 1, Name = "woft" });
infoList.Add(new Info() { Id=3,Name="rose"});
infoList.Add(new Info() { Id = 2, Name = "abc" });
Console.WriteLine("ReadT*********************");
IEnumerable query = null;
query = from items in infoList orderby items.Id select items;
foreach (var item in query)
{
Console.WriteLine(item.Id+":"+item.Name);
}
}
しかし、上記の2つの方法はいずれも1つのエンティティ属性のみをソートすることができ、異なる属性をソートするとifをたくさん書くしか判断できないので、面倒でソートルールを選択することはできません.
次に、入力パラメータに基づいてソートを実現する方法を示す.
private static void ListSort(string field,string rule)
{
if (!string.IsNullOrEmpty(rule)&&(!rule.ToLower().Equals("desc")||!rule.ToLower().Equals("asc")))
{
try
{
List infoList = GetList();
infoList.Sort(
delegate(Info info1, Info info2)
{
Type t1 = info1.GetType();
Type t2 = info2.GetType();
PropertyInfo pro1 = t1.GetProperty(field);
PropertyInfo pro2 = t2.GetProperty(field);
return rule.ToLower().Equals("asc") ?
pro1.GetValue(info1, null).ToString().CompareTo(pro2.GetValue(info2, null).ToString()) :
pro2.GetValue(info2, null).ToString().CompareTo(pro1.GetValue(info1, null).ToString());
});
Console.WriteLine("*****ListSort**********");
foreach (var item in infoList)
{
Console.WriteLine(item.Id + "," + item.Name);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} Console.WriteLine("ruls is wrong");
}
呼び出し方法:
ListSort("Name","desc");// Name desc
ListSort("Id","asc");// Id asc 。 。
もっといい方法があれば、みんなを歓迎して、一緒に勉強します........