已知1个List对象,需要2个排序显示在Grid里。
Account 里有个枚举类型(AccountType)的字段type,其值为A,B,C,D;
还有个decimal类型的字段Num;
排序条件1为按照type:C,B,A,D的顺序排序;
排序条件2为按照Num的降序排列。请问怎么实现这个算法呢?急等……

解决方案 »

  1.   

    实现自己的Comperer, 将这个比较器传入Sort方法中.
      

  2.   


            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();
                }
            }
      

  3.   

    using System;
    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个用法,自己改一改
      

  4.   

    首先谢谢ojlovecd
    用了这个方法之后,确实是先按照type,再按照num排序。但是希望是num的降序排列。要写2个委托来实现吗?
      

  5.   

    哈哈,太谢谢ojlovecd了!
    只要在a1.Num.CompareTo(a2.Num)前面加个负号就好了:
    return a1.Type.CompareTo(a2.Type) == 0 ? -a1.Num.CompareTo(a2.Num) : a1.Type.CompareTo(a2.Type);