已知1个List对象,需要2个排序显示在Grid里。
Account 里有个枚举类型(AccountType)的字段type,其值为A,B,C,D;
还有个decimal类型的字段Num;
排序条件1为按照type:C,B,A,D的顺序排序;
排序条件2为按照Num的降序排列。请问怎么实现这个算法呢?急等……
Account 里有个枚举类型(AccountType)的字段type,其值为A,B,C,D;
还有个decimal类型的字段Num;
排序条件1为按照type:C,B,A,D的顺序排序;
排序条件2为按照Num的降序排列。请问怎么实现这个算法呢?急等……
static void Main(string[] args)
{
List<Account> list = new List<Account>();
list.Add(new Account(AccountType.A, 1));
list.Add(new Account(AccountType.C, 2));
list.Add(new Account(AccountType.C, 3));
list.Add(new Account(AccountType.D, 4));
list.Sort(new Comparison<Account>(delegate(Account a1, Account a2)
{
return a1.Type.CompareTo(a2.Type) == 0 ? a1.Num.CompareTo(a2.Num) : a1.Type.CompareTo(a2.Type);
}));
foreach (Account a in list)
Console.WriteLine(a.ToString());
}
enum AccountType
{
C = 0, B, A, D
}
class Account
{
private AccountType type; public AccountType Type
{
get { return type; }
set { type = value; }
} private double num;
public double Num
{
get { return num; }
set { num = value; }
} public Account(AccountType type, double num)
{
this.type = type;
this.num = num;
} public override string ToString()
{
return type.ToString() + "," + num.ToString();
}
}
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Collections;namespace aaa
{
public class ListViewItemComparer : IComparer
{
#region 変数
#region m_Col
private int m_Col;
#endregion #region m_Order
private SortOrder m_Order;
#endregion #region m_IsDecimal
private bool m_IsDecimal;
#endregion
#endregion #region 関数
#region コンストラクタ
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="column">カラム</param>
/// <param name="order">オーダ</param>
/// <param name="isDecimal">10進法フーラグ</param>
public ListViewItemComparer(int column, SortOrder order, bool isDecimal)
{
m_Col = column;
m_Order = order;
m_IsDecimal = isDecimal;
}
#endregion #region オーダによって比較する
/// <summary>
/// オーダによって比較する
/// </summary>
/// <param name="x">x</param>
/// <param name="y">y</param>
/// <returns>比較結果</returns>
public int Compare(object x, object y)
{
if (m_Order == SortOrder.Ascending)
{
if (m_IsDecimal)
{
return (int.Parse(((ListViewItem)x).SubItems[m_Col].Text) - int.Parse(((ListViewItem)y).SubItems[m_Col].Text));
}
else
{
return string.Compare(((ListViewItem)x).SubItems[m_Col].Text, ((ListViewItem)y).SubItems[m_Col].Text);
}
}
else
{
if (m_IsDecimal)
{
return (int.Parse(((ListViewItem)y).SubItems[m_Col].Text) - int.Parse(((ListViewItem)x).SubItems[m_Col].Text));
}
else
{
return string.Compare(((ListViewItem)y).SubItems[m_Col].Text, ((ListViewItem)x).SubItems[m_Col].Text);
}
}
}
#endregion
#endregion
}
}用的时候:
#region リストヘッダクリック
/// <summary>
/// リストヘッダクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lsvClient_ColumnClick(object sender, ColumnClickEventArgs e)
{
//リスト内の項目の並べ替え方法を指定する
if (listview1.Sorting == SortOrder.Ascending)
{
listview1.Sorting = SortOrder.Descending;
}
else
{
listview1.Sorting = SortOrder.Ascending;
} if (e.Column == 0 || e.Column == 3)
{
listview1.ListViewItemSorter = new ListViewItemComparer(e.Column, listview1.Sorting, true);
}
else
{
listview1.ListViewItemSorter = new ListViewItemComparer(e.Column, listview1.Sorting, false);
}
if (listview1.SelectedItems.Count > 0)
{
listview1.SelectedItems[0].Focused = true;
listview1.SelectedItems[0].EnsureVisible();
}
else
{
listview1.Items[0].Selected = true;
listview1.Items[0].Focused = true;
}
}
#endregion
大致就是这么1个用法,自己改一改
用了这个方法之后,确实是先按照type,再按照num排序。但是希望是num的降序排列。要写2个委托来实现吗?
只要在a1.Num.CompareTo(a2.Num)前面加个负号就好了:
return a1.Type.CompareTo(a2.Type) == 0 ? -a1.Num.CompareTo(a2.Num) : a1.Type.CompareTo(a2.Type);