2016-03-24 13 views
1

名前、サイズ、日付でデータを並べ替える作業をしています。 私はそれらを名前で並べ替えることができましたが、クラスに複数のcompareメソッドを実装する方法についてはあまりよく分かりません。私はデリゲートの使用を見てみましたが、実際にどのように正確に動作するのかは分かりませんでした。 は、ここで私は私が考えていたもの比較で複数のソート方法を指定するにはどうすればよいですか?

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

の方法を比較するために、引数として、私は解決策は、デリゲートを使用しているほとんど確信しているので、誰かがplzはそれらが使用されている方法を説明できることを渡すための一種。私はそれが複雑だったデリゲートについてのMSDNのページを読む

答えて

0

私は代理人の必要性が表示されません:クラスコンストラクタでは、あなたが行う必要があるのは、ソートモードのパラメータを格納することです、そしてCompareメソッドそれ。 So:

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

お返事ありがとうございます – Acidburn73

関連する問題