【问题标题】:How to specify multiple sort methods in Compare?如何在比较中指定多种排序方法?
【发布时间】:2016-03-24 15:26:58
【问题描述】:

我正在按名称、大小和日期对数据进行排序。 我设法按名称对它们进行了排序,但我不太确定如何在我的类中实现多个比较方法。我试着看看使用代表,不能真正理解它们是如何工作的。 这是我到目前为止得到的结果

 private List<data> _myList = new List<data>();
 private bool sortAsc = false;

public class data
{
    public string Name { get; set; }
    public string Size { get; set; }
    public string Date { get; set; }
    public bool flag { get; set; }
}

 private void GridViewColumnHeader_Name(object sender, RoutedEventArgs e)
 {
     sortAsc = !sortAsc;
     if (sortAsc)
        _myList.Sort(new ListViewColumnSorterAsc());
     else
        _myList.Sort(new ListViewColumnSorterDesc());

        //------------------

     listView.Items.Clear();
     foreach (var item in _myList)
        listView.Items.Add(item);
}

public class ListViewColumnSorterAsc : IComparer<data>
{
    public int Compare(data x, data y)
    {
        if (x.flag == y.flag)
        {
            if (x.Name.CompareTo(y.Name) == 0)
                return 0;
            else if (x.Name.CompareTo(y.Name) == 1)
                return 1;
            else
                return -1;
        }

        else if (x.flag)
        {
            return -1;
        }

        return 0;
    }
}

//------- 我的想法是在“ListViewColumnSorterAsc”中创建一个构造函数并将一个 ENUM 传递给它以确定我希望如何进行排序 然后将其作为参数传递给类中的比较方法

public enum Sorting_Mode
{
    by_Name = 1,
    by_Size = 2,
    by_Date = 3
}; 

public class ListViewColumnSorterAsc : IComparer<data>
{
    private Sorting_Mode srtMode;

    public ListViewColumnSorterAsc(Sorting_Mode srtMode)
    {
        this.srtMode = srtMode;

        if(srtMode == Sorting_Mode.by_Size)
        {
            // i'm not quite sure what to set here and how to pass it
            // to Compare
        }

        if(srtMode == Sorting_Mode.by_Name)
        {

        }

        if(srtMode == Sorting_Mode.by_Date)
        {

        }
    }

    public int Compare(data x, data y)
    {
         // i want to use the same code as the above except it should be 
         // object1.compareType.CompareTo(object2.compareType)  
    }

我几乎可以肯定解决方案正在使用委托,所以有人可以解释一下它们是如何使用的。我在 MSDN 上阅读了有关委托的页面,这很复杂

【问题讨论】:

    标签: c# sorting delegates compare icomparable


    【解决方案1】:

    我认为不需要委托:在类构造函数中,您只需存储排序模式参数,然后在 Compare 方法中使用它。所以:

    public class ListViewColumnSorterAsc : IComparer<data>
    {
        private Sorting_Mode srtMode;
    
        public ListViewColumnSorterAsc(Sorting_Mode srtMode) 
        {
            this.srtMode = srtMode;
        }
    
        public int Compare(data x, data y) 
        {
            switch (srtMode) {
                case Sorting_Mode.by_Name:
                    return x.Name.CompareTo(y.Name);
                case Sorting_Mode.by_Size:
                    return x.Size.CompareTo(y.Size);
                case Sorting_Mode.by_Date:
                    return x.Date.CompareTo(y.Date);
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      相关资源
      最近更新 更多