Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用LINQ对字符数组进行C#排序_C#_Arrays_Linq_List_Sorting - Fatal编程技术网

使用LINQ对字符数组进行C#排序

使用LINQ对字符数组进行C#排序,c#,arrays,linq,list,sorting,C#,Arrays,Linq,List,Sorting,我正在尝试对下面的列表进行排序 列表排列=新列表() 它包含数字0,1,2,3,4,5,6,7,8,9的所有排列,但是它们没有排序,但我需要排序。这就是我为解决问题所做的: permutations = permutations.OrderBy(arr1 => arr1[9]).ToList(); permutations = permutations.OrderBy(arr1 => arr1[8]).ToList(); permuta

我正在尝试对下面的列表进行排序
列表排列=新列表()

它包含数字0,1,2,3,4,5,6,7,8,9的所有排列,但是它们没有排序,但我需要排序。这就是我为解决问题所做的:

        permutations = permutations.OrderBy(arr1 => arr1[9]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[8]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[7]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[6]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[5]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[4]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[3]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[2]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[1]).ToList();
        permutations = permutations.OrderBy(arr1 => arr1[0]).ToList();

如何避免这种情况,或者如何将其写在一行中?

首先,我要注意,您正在对列表重新排序9次

链排序的正确方法是使用
ThenBy
(请注意,比较顺序是颠倒的,以获得与现在相同的排序结果):

减少代码量的一个简单方法是

或者只是把清单排好

permutations.Sort((a1, a2) => (new string(a)).CompareTo(new string(a2)));
当然,它们会生成大量字符串,但下一个最好的选择是编写一个
IComparer
,以您希望的方式比较两个字符数组。另一种选择(因为我知道字符数组列表来自另一个问题)是将排列存储为字符串而不是数组。那么,排序是一件不需要动脑筋的事情:

permutations.Sort();

首先,我要指出的是,您正在对列表重新排序9次

链排序的正确方法是使用
ThenBy
(请注意,比较顺序是颠倒的,以获得与现在相同的排序结果):

减少代码量的一个简单方法是

或者只是把清单排好

permutations.Sort((a1, a2) => (new string(a)).CompareTo(new string(a2)));
当然,它们会生成大量字符串,但下一个最好的选择是编写一个
IComparer
,以您希望的方式比较两个字符数组。另一种选择(因为我知道字符数组列表来自另一个问题)是将排列存储为字符串而不是数组。那么,排序是一件不需要动脑筋的事情:

permutations.Sort();

只需使用
string
而不是基本上是
IEnumerable
这样你就可以简单地写了

permutations.Sort();
如果你想保持你的方式,你可以链接你的表达方式,如:

permutations = permutations.OrderBy(arr1 => arr1[9])
    .ThenBy(arr1 => arr1[8])
    .ThenBy(arr1 => arr1[7])
    .ThenBy(arr1 => arr1[6])
    .ThenBy(arr1 => arr1[5])
    .ThenBy(arr1 => arr1[4])
    .ThenBy(arr1 => arr1[3])
    .ThenBy(arr1 => arr1[2])
    .ThenBy(arr1 => arr1[1])
    .ThenBy(arr1 => arr1[0])
    .ToList();

只需使用
string
而不是基本上是
IEnumerable
这样你就可以简单地写了

permutations.Sort();
如果你想保持你的方式,你可以链接你的表达方式,如:

permutations = permutations.OrderBy(arr1 => arr1[9])
    .ThenBy(arr1 => arr1[8])
    .ThenBy(arr1 => arr1[7])
    .ThenBy(arr1 => arr1[6])
    .ThenBy(arr1 => arr1[5])
    .ThenBy(arr1 => arr1[4])
    .ThenBy(arr1 => arr1[3])
    .ThenBy(arr1 => arr1[2])
    .ThenBy(arr1 => arr1[1])
    .ThenBy(arr1 => arr1[0])
    .ToList();

这是相当古老的,但我一直在努力,并有一个解决方案,建议在评论中,但没有显示。正如所建议的,处理这个问题的动态方法是使用for循环,但是这里提到了一个gotcha

这比其他注释和答案中提到的将每个char[]转换为字符串要快得多

var p = permutations.OrderBy(x => x[0]);
for (int i = 1; i < s.Length; i++)
{
    var index = i; //Must do this to Avoid Gotcha
    p = p.ThenBy(x => x[index]);
}
permutations = p.ToList();
var p=permutations.OrderBy(x=>x[0]);
对于(int i=1;ix[指数]);
}
排列=p.ToList();

这是一个很老的问题,但我一直在研究这个问题,并且有一个在注释中建议但没有显示的解决方案。正如所建议的,处理这个问题的动态方法是使用for循环,但是这里提到了一个gotcha

这比其他注释和答案中提到的将每个char[]转换为字符串要快得多

var p = permutations.OrderBy(x => x[0]);
for (int i = 1; i < s.Length; i++)
{
    var index = i; //Must do this to Avoid Gotcha
    p = p.ThenBy(x => x[index]);
}
permutations = p.ToList();
var p=permutations.OrderBy(x=>x[0]);
对于(int i=1;ix[指数]);
}
排列=p.ToList();

回答得很好。只需要几个注释:OrderBy(a=>newstring(a)).ToList()&&.Sort((a1,a2)=>(newstring(a1)).CompareTo(newstring(a2));与.ThenBy方法以及permutations.Sort()相比,执行速度非常慢;如果我们使用chars,则不起作用,因为我们没有提供IComparer。第一种方法比第二种和第三种方法快4倍,这就是为什么我说这是一种减少代码的方法。我并不觉得奇怪,因为为这些字符串分配了大量内存,所以速度会变慢。这是否是一个问题取决于系统的整体性能。2)如果存储字符串而不是字符数组,则不需要将比较器传递给排序
——默认情况下,它将按字母顺序对字符串进行排序。它不适用于字符数组,因为字符数组没有“默认”比较器。很好,原始方法可以使用foreach来简化:而不是10行……var order=permutations.OrderBy(e=>e[0]);对于(inti=1;i<9;i++)顺序=顺序,然后是(e=>e[i]);var final=order.ToList();只需要修复闭包:Pi将以这种方式被捕获(闭包),因此它看起来像这样`var order=permutations.OrderBy(e=>e[0]);对于(inti=1;i<9;i++){var i1=i;order=order.ThenBy(e=>e[i1]);}var final=order.ToList()`回答得很好。只需要几个注释:OrderBy(a=>newstring(a)).ToList()&&.Sort((a1,a2)=>(newstring(a1)).CompareTo(newstring(a2));与.ThenBy方法以及permutations.Sort()相比,执行速度非常慢;如果我们使用chars,则不起作用,因为我们没有提供IComparer。第一种方法比第二种和第三种方法快4倍,这就是为什么我说这是一种减少代码的方法。我并不觉得奇怪,因为为这些字符串分配了大量内存,所以速度会变慢。这是否是一个问题取决于系统的整体性能。2)如果存储字符串而不是字符数组,则不需要将比较器传递给排序——默认情况下,它将按字母顺序对字符串进行排序。它不适用于字符数组,因为字符数组没有“默认”比较器。很好,原始方法可以使用foreach来简化:而不是10行……var order=permutations.OrderBy(e=>e[0]);对于(inti=1;i<9;i++)顺序=顺序,然后是(e=>e[i]);var final=order.ToList();只需要修复闭包:Pi将以这种方式被捕获(闭包),因此它看起来像这样`var order=permutations.OrderBy(e=>e[