我有一个List<ListViewItem>,我在VirtualMode的ListView中使用过它
列表中有5000个项目,每当单击ListView的列时,我都会使用LINQ和OrderBy对其进行排序,所以我编写了以下代码:
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();
}
}但是什么都没发生!我希望至少抛出一个异常!
你能给我带路吗?
谢谢。
发布于 2010-01-17 06:12:19
LINQ方法不影响集合,它们返回一个新的集合。您可以使用ToList方法将结果转换为列表,并将其分配回列表变量:
this.ListOfItems = this.ListOfItems.OrderBy(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)).ToList();发布于 2010-01-17 06:06:50
OrderBy和OrderByDescending扩展方法不修改集合,它们以指定的顺序返回集合的一系列项。在您的代码中,您只需丢弃这些方法的结果,因此不会发生任何事情……
如果您需要“就地”对集合进行排序(即修改项的实际顺序),请使用List.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);https://stackoverflow.com/questions/2079045
复制相似问题