Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
C# 按内部元素对元组内的元素进行排序_C#_Sorting - Fatal编程技术网

C# 按内部元素对元组内的元素进行排序

C# 按内部元素对元组内的元素进行排序,c#,sorting,C#,Sorting,我有一个多数据类型的元组dataframe public static void Main(string[] args) { int[] a = { 1, 0, 3, 4, 0}; int[] b = { 3, 0, 9, 10, 0}; int[] c = { 2, 3, 3, 5, 0}; var ret = new Dictionary<string, int[]>(); ret.Add("Jack", a

我有一个多数据类型的元组
dataframe

public static void Main(string[] args) {

    int[] a = {  1,  0,  3,  4,  0};
    int[] b = {  3,  0,  9, 10,  0};
    int[] c = {  2,  3,  3,  5,  0};

    var ret = new Dictionary<string, int[]>();
    ret.Add("Jack", a);
    ret.Add("Jane", b);
    ret.Add("James", c);

    var dataframe = new Tuple<string[], Dictionary<string, int[]>, string[]>(
        new string[] { "Game 1", "Game 2", "Game 3", "Game 4", "Game 5" },
        ret,
        new string[] { "A", "B", "C", "B", "A" }
    );

我认为解决这个问题的最好办法是重新思考数据的结构

例如,如果您使用了这些元素的数组(注释显示第一个元素的示例):

公共类游戏分数
{
//A
公共字符串排序键{get;set;}
//游戏1
公共字符串GameLabel{get;set;}
//{{“杰克”,1},{“简”,3},…}
公共字典{get;set;}
}

然后,您可以根据
SortKey
(那些
A
B
C
)进行排序,并将分数数据与列一起保存。将数据洗牌以将其放入
GameScores[]
,然后可以使用
数组。排序
。或者在
IEnumerable
上使用Linq的
OrderBy
,我建议将数据复制到另一个更适合排序的结构:

游戏{ 名称 球员 代码 }

只需使用Linq的
OrderBy(…)
,但看起来您更喜欢这种结构。如果是这样,并且您可以容忍
k*n*log(n)
复杂性,那么您可以将第三个数组复制到临时缓冲区,然后按此缓冲区的副本对所有数组进行排序:

var tmp = new string[dataframe.Item3.Length];
Array.Copy(dataframe.Item3, tmp, tmp.Length);

var t = new string[dataframe.Item3.Length];
Array.Copy(tmp, t, t.Length);
Array.Sort(t, dataframe.Item1);
foreach (var v in dataframe.Item2) {
    t = new string[dataframe.Item3.Length];
    Array.Copy(tmp, t, t.Length);
    Array.Sort(t, v.Value);
}
t = new string[dataframe.Item3.Length];
Array.Copy(tmp, t, t.Length);
Array.Sort(t, dataframe.Item3);

然而,我真的建议遵循第一种方法——将数据复制到更合适的结构中。速度会快得多。

我想我会先重新构造数据
public class GameScores
{
    // A
    public string SortKey { get; set; }
    // Game1
    public string GameLabel { get; set; }
    // { { "Jack", 1 }, { "Jane", 3 }, ... }
    public Dictionary<string, int> { get; set; }
}
var tmp = new string[dataframe.Item3.Length];
Array.Copy(dataframe.Item3, tmp, tmp.Length);

var t = new string[dataframe.Item3.Length];
Array.Copy(tmp, t, t.Length);
Array.Sort(t, dataframe.Item1);
foreach (var v in dataframe.Item2) {
    t = new string[dataframe.Item3.Length];
    Array.Copy(tmp, t, t.Length);
    Array.Sort(t, v.Value);
}
t = new string[dataframe.Item3.Length];
Array.Copy(tmp, t, t.Length);
Array.Sort(t, dataframe.Item3);