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

时间:2018-08-14 15:15:32

标签: c# linq

我有一个由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 个答案:

答案 0 :(得分:1)

此代码根据您传递给比较器的顺序对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);

            }
        }
  }

}

答案 1 :(得分:0)

这是您要寻找的吗?

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

编辑:我忘了加深一层。导致该错误的原因是,它想订购一个arrayobject而不是它的元素。

答案 2 :(得分:0)

这是您要通过二进制比较查找的答案,这非常简单,因为它会将第一个元素从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);

            }
        }
    }
}