【问题标题】:Sorting elements inside a tuple by inner elements按内部元素对元组内的元素进行排序
【发布时间】:2015-07-31 06:21:39
【问题描述】:

我有多个数据类型的元组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)
);

【问题讨论】:

    标签: c# sorting


    【解决方案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);
    

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

    【讨论】:

    • 我想我会先重组数据
    【解决方案2】:

    我认为解决此问题的最佳方法是重新考虑如何构建数据。

    例如,如果您有一个包含这些元素的数组(cmets 显示示例第一个元素):

    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。或者只是在 IEnumerable&lt;GameScores&gt; 上使用 Linq 的 OrderBy。

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 2015-10-18
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      相关资源
      最近更新 更多