2010-01-16 81 views
2

我有一个List<ListViewItem>,我用它在一个虚拟模式ListView中
列表中有5000个项目,并且我会将它与LINQ和OrderBy进行排序,只要ListView的列被点击,所以我写了代码如下:
List <> OrderBy IComparer?


List<ListViewItem> ListOfItems = new List<ListViewItem>(); 
ListViewColumnSorter lvwColumnSorter; 

void listView1_ColumnClick(object sender, ColumnClickEventArgs e) 
{ 
    try 
    { 
     // Determine if clicked column is already the column that is being sorted. 
     if (e.Column == lvwColumnSorter.SortColumn) 
     { 
      // Reverse the current sort direction for this column. 
      if (lvwColumnSorter.Order == SortOrder.Ascending) 
      { 
       lvwColumnSorter.Order = SortOrder.Descending; 
      } 
      else 
      { 
       lvwColumnSorter.Order = SortOrder.Ascending; 
      } 
     } 
     else 
     { 
      // Set the column number that is to be sorted; default to ascending. 
      lvwColumnSorter.SortColumn = e.Column; 
      lvwColumnSorter.Order = SortOrder.Ascending; 
     } 

     if (lvwColumnSorter.Order == SortOrder.Descending) 
      this.ListOfItems.OrderByDescending(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)); 
     else 
      this.ListOfItems.OrderBy(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)); 

     this.listView1.VirtualListSize = ListOfItems.Count; 
     this.listView1.Refresh(); 
    } 
    catch { } 
} 

public class CompareListItemsClass : IComparer<ListViewItem> 
{ 
    private CaseInsensitiveComparer ObjectCompare = new CaseInsensitiveComparer(); 
    private SortOrder OrderOfSort; 
    private int ColumnToSort; 

    public CompareListItemsClass(int columnIndex, SortOrder sortOrder) 
    { 
     ColumnToSort = columnIndex; 
     OrderOfSort = sortOrder; 
    } 

    public int Compare(ListViewItem listviewX, ListViewItem listviewY) 
    { 
     // Compare the two items 
     try 
     { 
      compareResult = ObjectCompare.Compare(
       int.Parse(listviewX.SubItems[ColumnToSort].Text), 
       int.Parse(listviewY.SubItems[ColumnToSort].Text)); 
     } 
     catch 
     { 
      compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, 
       listviewY.SubItems[ColumnToSort].Text); 
     } 


     // Calculate correct return value based on object comparison 
     if (OrderOfSort == SortOrder.Ascending) 
     { 
      // Ascending sort is selected, return normal result of compare operation 
      return compareResult; 
     } 
     else if (OrderOfSort == SortOrder.Descending) 
     { 
      // Descending sort is selected, return negative result of compare operation 
      return (-compareResult); 
     } 
     else 
     { 
      // Return '0' to indicate they are equal 
      return 0; 
     } 
    } 

    int IComparer<ListViewItem>.Compare(ListViewItem x, ListViewItem y) 
    { 
     throw new NotImplementedException(); 
    } 
} 

但是什么也没有发生!我期望至少有一个例外是抛出!
你能指导我吗?
谢谢。

+2

你怎么会看到一个异常,如果它被抛出,当你只是“吃”的例外(因此空的捕获)。 – 2010-01-16 22:12:35

+0

我已经添加了一个中断点 – 2010-01-16 22:21:25

回答

4

LINQ方法不影响集合,它们返回一个新集合。您可以使用ToList方法把结果变成一个列表,并为其分配回列表变量:

this.ListOfItems = this.ListOfItems.OrderBy(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)).ToList(); 
4

OrderByOrderByDescending扩展方法不会修改集合,它们会按照指定的顺序返回集合的一系列项目。在你的代码中,你只是丢弃这些方法的结果,所以什么也没有发生......

如果您需要对“就地”(即修改项目的实际顺序)进行排序,请使用List<T>.Sort方法。


编辑

要实现下降和上升的顺序,它实际上是更容易被Comparison<T>比使用IComparer<T>做到这一点,因为你只需要否定的结果......下面是一个例子:

Comparison<ListViewItem> temp = (x, y) => 
{ 
    int xvalue = int.Parse(x.SubItems[e.Column].Text); 
    int yvalue = int.Parse(y.SubItems[e.Column].Text); 
    return xvalue.CompareTo(yvalue); 
}; 

Comparison<ListViewItem> comparison; 
if (lvwColumnSorter.Order == SortOrder.Ascending) 
{ 
    comparison = temp; 
} 
else 
{ 
    comparison = (x, y) => -temp(x, y); 
} 

this.ListOfItems.Sort(comparison); 
+0

您可以发布一个示例代码降序和升序排序与列表。排序? – 2010-01-16 22:13:09

+0

谢谢Thomas Levesque – 2010-01-17 04:58:27

相关问题