通过内部元素对元组内的元素进行排序

时间:2015-07-30 21:42:23

标签: 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);
    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.item1dataframe.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)
);

2 个答案:

答案 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; }
}

然后,您可以根据SortKeyABC进行排序,并将得分数据与列保持一致。随机播放您的数据以将其转换为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);

但是,我真的建议遵循第一个 - 将数据复制到更合适的结构。它会快得多。