如何在比较中指定多种排序方法?

How to specify multiple sort methods in Compare?

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

 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 传递给它以确定我希望如何进行排序 然后将其作为参数传递给 class

中的 Compare 方法
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 上阅读了关于委托的页面,它很复杂

我认为不需要委托:在 class 构造函数中,您需要做的就是存储排序模式参数,然后在 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();
        }
    }
}