【问题标题】:sort custom array list with a specific field使用特定字段对自定义数组列表进行排序
【发布时间】:2020-03-29 17:02:04
【问题描述】:

我想按邮政地址排序,但我无法看到一些 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

【问题讨论】:

  • 你用小写的's'调用了排序 - 所以这不会编译。假设这是问题中的错误。您为什么不尝试示例中所说的 list.Sort((a,b) => a.PostalAddress.CompareTo(b.PostalAddress)) ?
  • 它给出了一个错误,指出无法将lamba表达式转换为类型'|Comparer',因为它不是委托类型
  • 您尝试使用的方法是静态的,您需要调用 Array.Sort(list,(a,b) => a.PostalAddress.CompareTo(b.PostalAddress))
  • 你试过这个:stackoverflow.com/questions/32235684/… 吗?
  • 已验证的解决方案请查看stackoverflow.com/a/57371579/6923146

标签: c# sorting arraylist


【解决方案1】:

已经被很多https://stackoverflow.com/a/57371579/6923146认可了

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

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;
        }
    }

}

【讨论】:

    【解决方案2】:

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

    像这样使用数组

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

    或使用类似List&lt;T&gt; 类的东西

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

    如果你使用数组,那么接受Comparison&lt;T&gt; 实例的排序函数是静态的

    在此处查看文档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) =&gt; a.PostalAddress.CompareTo(b.PostalAddress))

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

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

    【讨论】:

    • 执行此操作时出现两个错误 1 ​​.argument 1: cannot convert System.Collections.arraylist to system.array 2 .cannot convert lambda expression to type array because it is not a delegate type
    • 对不起,我很抱歉。我没点击你用的是ArrayList……你为什么用ArrayList???
    • 我不太确定,但我在整个程序中都使用了它围绕数组列表
    • 我已将其更改为列表,因为数组列表并不真正支持 Lamba 函数,只是不确定如果它有超过 25000 个数据,排序的速度如何,无论如何感谢您的帮助:)
    【解决方案3】:

    你真的需要使用ArrayList吗?

    这是 .NET 前泛型时代的遗物,您应该尽可能使用IEnumerable&lt;T&gt; 的实现,例如List&lt;T&gt;.

    LINQ 在IEnumerable&lt;T&gt; 上运行,因此不适用于您的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2012-04-22
      • 2013-05-08
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多