代码之家  ›  专栏  ›  技术社区  ›  Mark T

是否支持基于索引的排序?

  •  7
  • Mark T  · 技术社区  · 15 年前

    是否有任何内置的C#支持进行索引排序?

    更多详情:
    我有几组数据存储在单独的双精度通用列表中。 这些列表的长度总是相等的,并且保存着相应的数据项,但是这些列表是动态变化的,所以我不能将相应的数据项干净地存储在类或结构中。(我也在处理一些遗留问题。)

    我需要能够从任何一个数据集中对这些键入的数据进行排序。

    我认为最好的方法是添加一级间接寻址,并使用基于索引的排序。这种类型已经使用多年了。

    基于索引排序的快速定义
    使“索引”(一个连续整数数组)的长度与列表的长度相同,然后排序算法对整数列表进行排序,以便 anylist[index[N]]

    我一直找不到它。。。我发现的所有东西都重新排列了收藏本身。我猜支持是存在的,但我还没有找对地方。

    我正在Windows下使用C#.NET 3.5。

    2 回复  |  直到 15 年前
        1
  •  15
  •   Guffa    15 年前

    设置索引数组后,可以使用自定义 Comparison<T> 用于比较数据数组中相应项中的值:

    Array.Sort<int>(index, (a,b) => anylist[a].CompareTo(anylist[b]));
    
        2
  •  0
  •   Daniel Brückner Pradip    15 年前

    下面的代码实现了索引排序。请注意用于克隆数据数组的ToArray()调用。如果省略,数据数组也将被排序。

    static void Main(String[] args)
    {
       Int32[] data = new Int32[] { -6, 6, 5, 4, 1, 2, 3, 0, -1, -2, -3, -4, -5 };
    
       Int32[] indices = Enumerable.Range(0, data.Length).ToArray();
    
       Array.Sort(data.ToArray(), indices);
    
       foreach (Int32 index in indices)
       {
           Console.Write(String.Format("{0} ", data[index]));
       }
    
       Console.ReadLine();
    }
    

    输出是经过仔细检查的。

    -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6