使用特定字段对自定义数组列表进行排序

时间:2019-12-04 19:51:15

标签: c# sorting arraylist

我想按邮政地址排序,但我无法看到一些Linq函数尝试过它们,但我似乎无法获得所需的所有必需参数。 例如我看到了这个例子

list.Sort((p, q) => p.Category.CompareTo(q.Category)); /*has and error that says  cannot convert lamba expressions to type '|Comparer' because it is not a delegate*/

但是我似乎不了解如何使用它。

MyCustomList.cs

  class MyCustomList
    {
        private string name;
        private string postalAddress;


    public MyCustomList(string name, string postalAddress)
        {
            this.name = name;
            this.postalAddress = postalAddress;
        }

//getters and setters
   public string Name
        {
            get
            {
                return name;
            }

            set
            {
                name = value;
            }
        }

        public string PostalAddress
        {
            get
            {
                return postalAddress;
            }

            set
            {
                postalAddress = value;
            }
        }
}

Form1.cs

 ArrayList list = new ArrayList();
 list.Add(new MyCustomList("A somename","A Fake Postal Address");
 list.Add(new MyCustomList("B somename","B Fake Postal Address");

list.Sort(); // Sort by Postal adress

3 个答案:

答案 0 :(得分:2)

您真的需要使用ArrayList吗?

这是.NET泛型时代以来的遗物,您应该尽可能地使用IEnumerable<T>的实现,例如List<T>

LINQ在IEnumerable<T>上运行,因此无法与您的ArrayList一起使用,而您正在寻找的方法是OrderByOrderByDescending

示例:

var list = new List<MyCustomList>();
list.Add(new MyCustomList("A somename","A Fake Postal Address"));
list.Add(new MyCustomList("B somename","B Fake Postal Address"));

list.OrderBy(cl => cl.Postcode); // Sort by Postal address

答案 1 :(得分:0)

首先停止使用ArrayList-它已经过时了。

要么像这样使用Array

var list = MyCustomList[2];
list[0] = new MyCustomList(...
list[1] = new MyCustomList(....

或使用类似List<T>类的东西

var list = new List<MyCustomList>();
list.Add(new MyCustomList(...
list.Add(new MyCustomList(...

如果使用数组,则采用Comparison<T>实例的Sort函数是静态的

https://docs.microsoft.com/en-us/dotnet/api/system.array.sort?view=netframework-4.8#System_Array_Sort__1___0___System_Comparison___0__此处查看文档

您需要这样称呼它:

Array.Sort(list, (a,b) => a.PostalAddress.CompareTo(b.PostalAddress))

或在列表或数组上使用linq并使用OrderBy

var orderedList = list.OrderBy(a => a.PostalAddress);

答案 2 :(得分:0)

已被许多https://stackoverflow.com/a/57371579/6923146

批准

对于使用linq在c#中的特定字段进行按顺序排序

list = list.OrderByDescending(x => x.Name).ToList();
list = list.OrderBy(x => x.Name).ToList();
//list.OrderBy(x => x.YourClassSpecificField).ToList()

示例:

请尝试在小提琴中运行以下代码:

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        List<MyCustomList> list = new List<MyCustomList>();

            list.Add(new MyCustomList("A somename", "A Fake Postal Address"));
            list.Add(new MyCustomList("B somename", "B Fake Postal Address"));

            //list.Sort();
            Console.WriteLine("descending order");
            list = list.OrderByDescending(x => x.Name).ToList();
            foreach (MyCustomList o in list)
            {
                Console.WriteLine(o.Name + " -- " + o.PostalAddress );
            }
            Console.WriteLine("ascending order");
            list = list.OrderBy(x => x.Name).ToList();
            foreach (MyCustomList o in list)
            {
                Console.WriteLine(o.Name + " -- " + o.PostalAddress );
            }
    }

    public class MyCustomList
    {
        private string name;
        private string postalAddress;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public string PostalAddress
        {
            get { return postalAddress; }
            set { postalAddress = value; }
        }
        public MyCustomList(string name, string postalAddress)
        {
            this.name = name;
            this.postalAddress = postalAddress;
        }
    }

}