我的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<>
什么是正确的方法?
答案 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 OrderBy
和ThenBy
对letter
(字符串)和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; }
}
答案 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;
}
}