我有一个由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建议的选项要快。但是他的答案也值得一看。
答案 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);
}
}
}
}