为了账号安全,请及时绑定邮箱和手机立即绑定

基于子列表对列表列表进行排序的方法

基于子列表对列表列表进行排序的方法

C#
蓝山帝景 2021-11-28 16:34:17
我有一个由int数组组成的列表列表:(List<List<int[]>>)我想根据列表int第一个元素中数组中的第一个索引对列表列表进行排序。到目前为止,我的解决方案是:List<List<int[]>> myList = new List<List<int[]>> { new List<int[]> { new int[] { 1, 5 }, new int[] { 2, 4 } }, new List<int[]> { new int[] { 3, 4 }, new int[] { 0, 1 } } };myList.OrderByDescending(x => x.Max(y => y[0])).ToList();结果是第二个列表排在第一位,第一个排在第二位。但我不喜欢那个,因为性能是一个关键点,我不喜欢执行这个Max操作,因为它没用。那么,有没有更好的办法呢?——编辑:我完成了使用:myList.OrderByDescending(x => x[0][0]).ToList();正如 CodeCaster 在评论中提出的那样。这个在我的代码中比 Aldert 提出的选项更快。但他的回答也值得一看。
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

此代码根据您传递给比较器的顺序对 asc 或 desc 进行排序。它在元素上运行 O*1,以设置能够进行比较的结构。我很想知道它是否适合你更快(我认为只适用于非常大的树)。当您已经对所有内部列表进行排序时,您不需要保留帮助字典,然后您可以取最后一个元素。


using System;

using System.Collections.Generic;


namespace ConsoleApp1

{

class Program

    {


        static void Main(string[] args)

        {

            List<List<int>> mainList = new List<List<int>>();


            List<int> newList = new List<int>();



            Random rand = new Random();

            for (int i = 0; i < 30; i++)

            {

                int ra = rand.Next(200);


                if (i % 5  == 0)

                {

                    if (newList.Count > 0)

                    {

                        newList = new List<int>();

                        mainList.Add(newList);

                    }

                }

                newList.Add(ra);


            }


            mainList.Sort( new MaxComparer(mainList, false));


            foreach (List<int> oneL in mainList)

            {

                foreach (int oneInt in oneL)

                {

                    Console.Write(oneInt + " ");

                }

                Console.WriteLine();

            }


        }


        public class MaxComparer : IComparer<List<int>>

        {

            bool order = false;

            Dictionary<int, int> helper = new Dictionary<int, int>();

            public MaxComparer(List<List<int>> sortList, bool Order)

            {

                order = Order;


                foreach (List<int> oneL in sortList)

                {

                    int max = int.MinValue;

                    foreach (int oneInt in oneL)

                    {

                        if (max < oneInt) max = oneInt;

                    }

                    helper.Add(oneL.GetHashCode(), max);

                }

            }


            public int Compare(List<int> x, List<int> y)

            {

                return helper[x.GetHashCode()].CompareTo(helper[y.GetHashCode()]) * (order ? 1:-1);


            }

        }

  }

}


查看完整回答
反对 回复 2021-11-28
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

这是您通过二进制比较寻找的答案,它相当简单,因为它从 sublint 和数组中取出第一个元素(正如您所寻找的那样)。


using System;

using System.Collections.Generic;


namespace ConsoleApp1

{

    class Program

    {


        static void Main(string[] args)

        {

            List<List<int[]>> mainList = new List<List<int[]>>();




            Random rand = new Random();

            for (int i = 0; i < 30; i++)

            {

                List<int[]> subList = new List<int[]>();


                int limj = rand.Next(5);

                for (int j = 0; j < 5 + limj; j++)

                {

                    int limk = rand.Next(5);

                    int[] arrayInt = new int[limk + 5];

                    for (int k = 0; k < limk + 5; k++)

                    {

                        arrayInt[k] = rand.Next(200);

                    }

                    subList.Add(arrayInt);


                }

                mainList.Add(subList);


            }


            mainList.Sort(new MaxComparer(false));


            foreach (List<int[]> oneL in mainList)

            {

                foreach (int[] arrayList in oneL)

                {

                    foreach (int i in arrayList) Console.Write(i + " ");

                    Console.Write("|");

                }

                Console.WriteLine();

            }


        }


        public class MaxComparer : IComparer<List<int[]>>

        {

            bool order = false;

            public MaxComparer(bool Order)

            {

                order = Order;



            }


            public int Compare(List<int[]> x, List<int[]> y)

            {


                return x[0][0].CompareTo(y[0][0]) * (order ? 1 : -1);


            }

        }

    }

}



查看完整回答
反对 回复 2021-11-28
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

这是你想要的?

 var sortedList = myList.OrderBy(x => x.Select(y => y.Select(z => z).OrderBy(z => z))).ToList();

编辑:我忘了深入一层。导致该错误的原因是它想要对数组对象而不是其元素进行排序。


查看完整回答
反对 回复 2021-11-28
  • 3 回答
  • 0 关注
  • 252 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信