2016-03-24 3 views
1

Je travaille sur le tri des données par nom, taille et date. J'ai réussi à les trier par nom, mais je ne suis pas sûr de savoir comment implémenter plusieurs méthodes de comparaison dans ma classe. J'ai essayé de jeter un oeil à l'aide de délégués, je ne pouvais pas vraiment comprendre comment ils fonctionnent exactement. Voici ce que je suis arrivé à ce jourComment spécifier plusieurs méthodes de tri dans Comparer?

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

// ------- Ce que j'avais à l'esprit était de créer un constructeur dans « ListViewColumnSorterAsc » et passer un ENUM pour identifier la façon dont je veux la sorte de se produire puis passer que comme argument pour comparer la méthode dans la classe

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

je suis presque sûr que la solution est à l'aide des délégués, donc quelqu'un pourrait plz expliquer comment ils sont utilisés. J'ai lu la page sur MSDN à propos de déléguer que c'était compliqué

Répondre

0

Je ne vois pas le besoin de délégués: dans le constructeur de classe, tout ce que vous devez faire est de stocker le paramètre de mode de tri, puis dans la méthode Compare que vous utilisez il. Donc:

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

merci de répondre – Acidburn73