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);