按多列对ListView进行排序

时间:2018-05-02 03:43:03

标签: c# listview

我的ListView中有3列:名称,string值和int值。

  

名称:Item1,Item2,Item3

     

字符串值:A,B,A

     

int value:3,2,1

我想首先按字符串值对ListView进行排序。像这样:

  

名称:Item1,Item3,Item2

     

字符串值:A,A,B

     

int value:3,1,2

之后我想按int值排序。像这样:

  

名称:Item3,Item1,Item2

     

字符串值:A,A,B

     

int value:1,3,2

为此我应该使用List<>还是有办法? 如果我应该使用List<>什么是正确的方法?

3 个答案:

答案 0 :(得分:0)

假设IEnumerable<T>喜欢List<T>

List<T> sortedList = list.OrderBy(x => x.Col1).ThenBy(x => x.Col2).ThenBy(x => x.Col3).ToList();

答案 1 :(得分:0)

使用LINQ OrderByThenByletter(字符串)和number(int)属性进行排序:

List<myClass> myList = new List<myClass>()
{
    new myClass(){name="Item1",letter="A", number=3 },
    new myClass(){name="Item2",letter="B", number=2 },
    new myClass(){name="Item3",letter="A", number=1 }
};

var result = myList.OrderBy(x => x.letter).ThenBy(x => x.number).ToList();

<强>结果:

  

name:Item3,Item1,Item2

     

信:A,A,B

     

数:1,3,2

将列表result中的项目添加到ListView

listView1.View = View.Details;
listView1.Columns.Add("name");
listView1.Columns.Add("letter");
listView1.Columns.Add("number");
foreach (var item in result)
{
    listView1.Items.Add(new ListViewItem(new string[] { item.name,item.letter,item.number.ToString()}));
}

myClass

class myClass
{
    public string name { get; set; }
    public string letter { get; set; }
    public int number { get; set; }
}

DEMO HERE

答案 2 :(得分:0)

您可以使用自定义ListViewItemSorter对ListView控件的列进行排序。

这是一个自定义重载IComparer,可让您指定1或2列进行排序,并可选择不为默认Column[0]订单传递任何参数。

指定排序顺序:

listView1.Sorting = SortOrder.Ascending;

...以及要比较的列的索引。您输入它们的顺序当然很重要。在您的示例中,您应输入:

listView1.ListViewItemSorter = new ListViewItemComparer(1, 2);

默认排序列[0]可以这样设置:

listView1.ListViewItemSorter = new ListViewItemComparer();

ListViewItemComparer班级:

class ListViewItemComparer : IComparer
{
    private int col1 = -1;
    private int col2 = -1;
    public ListViewItemComparer()
    {
        col1 = 0;
    }
    public ListViewItemComparer(int Column)
    {
        col1 = Column;
    }

    public ListViewItemComparer(int Column1, int Column2)
    {
        col1 = Column1;
        col2 = Column2;
    }

    public int Compare(object x, object y)
    {
        int result = string.Compare(((ListViewItem)x).SubItems[col1].Text, ((ListViewItem)y).SubItems[col1].Text);
        if (!(col2 < 0))
            result |= string.Compare(((ListViewItem)x).SubItems[col2].Text, ((ListViewItem)y).SubItems[col2].Text);
        return result;
    }
}