如何在比较中指定多种排序方法?
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();
}
}
}
我正在按名称、大小和日期对数据进行排序。 我设法按名称对它们进行排序,但我不太确定如何在 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();
}
}
}