Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#排序列表视图_C#_Listview - Fatal编程技术网

C#排序列表视图

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 我正在尝

这可能很容易。我没有什么问题。我的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
我正在尝试使用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();
}