我有多个数据类型的元组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" }
);
dataframe.item1
和dataframe.item3
中的值是dataframe.item2
中字典中列的不同标签。
我想按元组dataframe.item3
按字母顺序对元组中的项进行排序,包括字典中的数组顺序。
因此dataframe.item3
将为{"A","A","B","B","C"}
dataframe.item1
将为{"Game 1","Game 5","Game 2","Game 4","Game 3"}
dataframe.item2["Jack"]
将为{1, 0, 0, 4, 3}
这是我试过的
//Sorting the dictionary
Dictionary<string, int[]> sortedDict = new Dictionary<string, int[]>();
for each (var item in dataframe.Item2)
{
Array.Sort(dataframe.Item3,dataframe.Item2[item])
}
//Sorting the strings and creating a new dataframe
var sorted_dataframe = new Tuple<string[], Dictionary<string, int[]>, string[]>(
Array.Sort(dataframe.Item3, dataframe.Item1),
sortedDict,
Array.Sort(dataframe.Item3)
);
答案 0 :(得分:1)
我认为解决此问题的最佳方法是重新考虑如何构建数据。
例如,如果您有一个这样的数组(注释显示示例第一个元素):
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; }
}
然后,您可以根据SortKey
(A
,B
和C
进行排序,并将得分数据与列保持一致。随机播放您的数据以将其转换为GameScores[]
,您可以使用Array.Sort
。或者只在OrderBy
上使用Linq的IEnumerable<GameScores>
。
答案 1 :(得分:1)
好吧,我建议将数据复制到另一个结构,更适合排序:
游戏{ 名称 玩家 码 }
并且只使用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);
但是,我真的建议遵循第一个 - 将数据复制到更合适的结构。它会快得多。