首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<> OrderBy IComparer?

List<> OrderBy IComparer?
EN

Stack Overflow用户
提问于 2010-01-17 06:01:13
回答 2查看 8.9K关注 0票数 2

我有一个List<ListViewItem>,我在VirtualMode的ListView中使用过它

列表中有5000个项目,每当单击ListView的列时,我都会使用LINQ和OrderBy对其进行排序,所以我编写了以下代码:

代码语言:javascript
复制
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();
    }
}

但是什么都没发生!我希望至少抛出一个异常!

你能给我带路吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-17 06:12:19

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

代码语言:javascript
复制
this.ListOfItems = this.ListOfItems.OrderBy(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)).ToList();
票数 5
EN

Stack Overflow用户

发布于 2010-01-17 06:06:50

OrderByOrderByDescending扩展方法不修改集合,它们以指定的顺序返回集合的一系列项。在您的代码中,您只需丢弃这些方法的结果,因此不会发生任何事情……

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

编辑

要实现降序和升序,实际上使用Comparison<T>比使用IComparer<T>更容易,因为您只需要否定结果...下面是一个例子:

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2079045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档