C#排序列表视图
这可能很容易。我没有什么问题。我的listview项具有如下数据类型C#排序列表视图,c#,listview,C#,Listview,这可能很容易。我没有什么问题。我的listview项具有如下数据类型 col/row Name age distance Flick 20 1.4 Hamn 19 0.9 John 19 1.0 我想通过检查最小距离对列表视图进行排序。所以会是这样的: col/row Name age distance Hamn 19 0.9 John 19 1.0 Flick 20 1.4 我正在尝
col/row Name age distance
Flick 20 1.4
Hamn 19 0.9
John 19 1.0
我想通过检查最小距离对列表视图进行排序。所以会是这样的:
col/row Name age distance
Hamn 19 0.9
John 19 1.0
Flick 20 1.4
我正在尝试使用listview控件名排序
。但它不起作用。
我的问题是如何通过检查item.subitems[2]对数据进行排序,并使我的listview与上面的新列表类似。PS。此外,我的数据有3个以上的数据,不仅仅是Hamn、John、Flick
多谢各位
var orderedList = your_list.OrderBy(r => r.subitem);
此外,您还可以使用自己的排序方法(我认为在您的情况下不需要)
用法:
var orderedList = your_list.OrderBy(r => GetOrder(r.subitem));
抽样方法:
Public Static int GetOrder(string _arg)
{
switch (_arg)
{
case 'Section One':
return 1;
case 'Section Two':
return 2;
case 'Section Three':
return 3;
.
.
.
default:
return int.MaxValue;
}
}
-----------编辑:添加了示例项目-----------------
只需使用以下代码:
var list = List_unsort.OrderBy(x => x.number);
项目示例:
public static void Main()
{
Console.WriteLine("Start Work ...\r\n");
Create_list();
Sort_list();
Console.WriteLine("\r\nFinish.");
}
private static List<custom_item> List_unsort = new List<custom_item>();
private class custom_item
{
public int id { get; set; }
public string name { get; set; }
public double number { get; set; }
}
private static void Create_list()
{
Random rnd = new Random();
Console.WriteLine("Unsort List : ");
for (int i = 0; i < 10; i++)
{
custom_item item = new custom_item();
item.name = i.ToString();
item.id = i;
double rnd_num = rnd.NextDouble();
item.number = rnd_num;
Console.WriteLine("ID : " + item.id + ", number : " + item.number);
List_unsort.Add(item);
}
Console.WriteLine("\r\n--------------------\r\n");
}
private static void Sort_list()
{
var list = List_unsort.OrderBy(x => x.number);
Console.WriteLine("Sort List : ");
foreach (var item in list)
{
Console.WriteLine("ID : " + item.id + ", number : " + item.number);
}
}
publicstaticvoidmain()
{
Console.WriteLine(“开始工作…\r\n”);
创建_列表();
排序列表();
Console.WriteLine(“\r\n完成”);
}
私有静态列表\u unsort=新列表();
私有类自定义项
{
公共int id{get;set;}
公共字符串名称{get;set;}
公共双精度数{get;set;}
}
私有静态无效创建_列表()
{
随机rnd=新随机();
Console.WriteLine(“取消排序列表:”);
对于(int i=0;i<10;i++)
{
自定义项目=新自定义项目();
item.name=i.ToString();
项目id=i;
double rnd_num=rnd.NextDouble();
item.number=rnd_num;
Console.WriteLine(“ID:+item.ID+”,编号:+item.number);
列表\取消排序添加(项目);
}
Console.WriteLine(“\r\n------------------\r\n”);
}
私有静态无效排序列表()
{
var list=list\u unsort.OrderBy(x=>x.number);
Console.WriteLine(“排序列表:”);
foreach(列表中的变量项)
{
Console.WriteLine(“ID:+item.ID+”,编号:+item.number);
}
}
和输出:
开始工作
取消排序列表:ID:0,编号:0.333175984366413
身份证号码:1,号码:0.886352685227223
识别号:2,号码:0.633657003582295
身份证号码:3,号码:0.319651832021611
身份证号码:4,号码:0.3404393483512
身份证号码:5,号码:0.476074807567557
身份证号码:6,号码:0.664470672451179
身份证号码:7,号码:0.14823883685667
识别号:8,号码:0.375242880254631
身份证号码:9,号码:0.186346486763259
排序列表: 身份证号码:7,号码:0.14823883685667 身份证号码:9,号码:0.186346486763259 身份证号码:3,号码:0.319651832021611 ID:0,号码:0.333175984366413 身份证号码:4,号码:0.3404393483512 识别号:8,号码:0.375242880254631 身份证号码:5,号码:0.476074807567557 识别号:2,号码:0.633657003582295 身份证号码:6,号码:0.664470672451179 身份证号码:1,号码:0.886352685227223 结束 编译和测试项目的链接: 或
下面是一个使用ListViewItemSorter属性的非常简单的示例。它假定距离始终是第三列(第二个子项):
私有类ItemComparer:IComparer
{
公共整数比较(对象x、对象y)
{
//将对象转换为ListViewItems
ListViewItem i1=x作为ListViewItem;
ListViewItem i2=y作为ListViewItem;
//如果与ListViewItems的对话失败,则返回-1(小于)
if(i1==null)返回-1;
if(i2==null)返回-1;
//如果ListViewItems的子项数不正确,则返回-1(小于)
如果(i1.SubItems.Count<2)返回-1;
如果(i2.SubItems.Count<2)返回-1;
//将子项2(索引1)文本转换为数值
双距离1,距离2;
if(!Double.TryParse(i1.SubItems[1].Text,out distance 1))返回-1;
如果(!Double.TryParse(i2.SubItems[1].Text,out distance 2))返回-1;
//比较距离1和距离2(-1=小于,0=等于,1=大于)
返回距离1.与(距离2)相比;
}
}
公共表格1()
{
初始化组件();
添加(新的ListViewItem(新字符串[]{“Flick”、“20”、“1.4”});
Add(新的ListViewItem(新字符串[]{“John”,“19”,“1.0”}));
Add(新的ListViewItem(新字符串[]{“Hamn”、“19”、“0.9”}));
listView1.ListViewItemSorter=new ItemComparer();
listView1.Sort();
}
检查这个答案:我已经做了很长时间了,但我认为您可以实现一个自定义比较器,在排序时称为ListView,比较器会比较项目的距离。请参阅ListViewItemSorter属性。对不起,我是初学者。“第一节”是什么情况?我必须把它改成什么?@Eddga:你在干什么!我说在你的情况下,你不需要自定义排序方法!只需要这样使用:var list=list\u unsort.OrderBy(x=>x.subitem)代码>这里有一个工作示例:或谢谢。这个答案也适用。但很抱歉,它只能批准一个答案:(谢谢。但我有一些问题。检查项的点在哪里。子项[2](距离)。我添加了注释以更好地解释自定义比较器。在列表视图上调用sort()时,它将使用“pairs”调用比较器您为确定其排序顺序而添加的ListViewItem的。我无法创建新类。它在IComparer处显示错误。错误是什么?您需要一个“using System.Collections”语句来“包括”IComparer接口。如果我想让它检查item.subitems[7]。因此我必须将(i1.subitems.Count<2)更改为(i1.subitems.Count<7)和i1。子项[1]。文本到i1。子项[6]。文本?正确吗?
private class ItemComparer : IComparer
{
public int Compare(object x, object y)
{
// Convert objects to ListViewItems
ListViewItem i1 = x as ListViewItem;
ListViewItem i2 = y as ListViewItem;
// If converstion to ListViewItems failed, return -1 (less than)
if (i1 == null) return -1;
if (i2 == null) return -1;
// If ListViewItems DO NOT have the correct number of subitems, return -1 (less than)
if (i1.SubItems.Count < 2) return -1;
if (i2.SubItems.Count < 2) return -1;
// Convert subitem 2 (index 1) text to a numeric value
double distance1, distance2;
if (!Double.TryParse(i1.SubItems[1].Text, out distance1)) return -1;
if (!Double.TryParse(i2.SubItems[1].Text, out distance2)) return -1;
// Compare the distance1 to distance2 (-1 = less than, 0 = equal, 1 = greater than)
return distance1.CompareTo(distance2);
}
}
public Form1()
{
InitializeComponent();
listView1.Items.Add(new ListViewItem(new string[] { "Flick", "20", "1.4" }));
listView1.Items.Add(new ListViewItem(new string[] { "John", "19", "1.0" }));
listView1.Items.Add(new ListViewItem(new string[] { "Hamn", "19", "0.9" }));
listView1.ListViewItemSorter = new ItemComparer();
listView1.Sort();
}