1
int[] a = {120, 60, 50, 40, 30, 20};
int[] b = {12, 29, 37, 85, 63, 11};
int[] c = {30, 23, 90 ,110, 21, 34};

今、私は a をソートし、そのインデックスを使用して b と c をソートしたい

例:

sorted a = {20,30,40,50,60,120};
sorted b should be ={ 11,63,85,37,29,12};
and sorted c should be = { 34,21,110,90,23,30};

C# でそれを行う方法

4

5 に答える 5

2

1 つのオプション:

int[] a = {120, 60, 50, 40, 30, 20};
int[] b = {12, 29, 37, 85, 63, 11};
int[] c = {30, 23, 90 ,110, 21, 34};

var ordered = a.Select((item, index) =>
                       Tuple.Create(item, b[index], c[index]))
               .OrderBy(tuple => tuple.Item1).ToArray();

a = ordered.Select(tuple => tuple.Item1).ToArray();
b = ordered.Select(tuple => tuple.Item2).ToArray();
c = ordered.Select(tuple => tuple.Item3).ToArray();
于 2013-10-21T06:14:18.907 に答える
0

退屈なので、新しいオブジェクトの作成と並べ替えを最小限に抑えようとしました。

static void Main(string[] args)
{
    int[] a = { 120, 60, 50, 40, 30, 20 };
    int[] b = { 12, 29, 37, 85, 63, 11 };
    int[] c = { 30, 23, 90, 110, 21, 34 };

    var indexes = Enumerable.Range(0, a.Length).OrderBy(i => a[i]).ToArray();

    var temp = new int[a.Length];
    foreach (var arr in new[] { a, b, c })
    {
        for (int i = 0; i < a.Length; i++) temp[i] = arr[indexes[i]];
        for (int i = 0; i < a.Length; i++) arr[i] = temp[i];
    }

    Console.WriteLine(String.Join(", ", a));
    Console.WriteLine(String.Join(", ", b));
    Console.WriteLine(String.Join(", ", c));
    Console.ReadLine();
}

最善の方法ではありません(一時配列を何らかの形で取り除くことができると確信しています)が、それでも別の解決策です。パフォーマンスが問題になるまで、LINQesque ソリューションに固執することをサポートします。

于 2013-10-21T06:36:57.687 に答える
0

次のように、間接レイヤーを使用してそれを行うことができます。

  1. 値 0、1、2、...、N-1 を int 配列に入れ、たとえば、インデックスと名付けます。
  2. すべての i に対して a[indices[i]] <= a[indices[i+1]] となるように配列インデックスを並べ替えます。比較関数は、a[indices[Left]] と a[indices[Right]] を比較します。
  3. インダイレクションを使用して他の配列の要素にアクセスします: a[indices[i]] など。

必要に応じて、インデックスで定義された順序を使用して、a、b、および c の新しいコピーを作成できます。ただし、元の配列を変更しないというオプションもあります。

元の配列を変更しないというこのオプションは、非常に興味深いものです。複数の同時注文を並行してアクティブにすることができます。

于 2013-10-21T06:20:48.880 に答える
0

Eli Arbel が回答を提供してくれたので、LINQ を使用することをお勧めします。しかし、LINQ を知らない人のための別の解決策があります。

class Program
    {
        public static int get_key(int key , int [,] keylist)
        {
            for (int i = 0; i <= keylist.GetUpperBound(0); ++i)
            {
                if (keylist[i, 0] == key)
                    return keylist[i, 1];
            }
            return -1;
        }
       public static int[] Sort_by_index(int [] arr , int [] key , int [,] index_list)
        {
            int[] _out = new int[arr.Length];

            for (int i = 0; i < key.Length; i++)
            {
                //Get key index
                int key_index = get_key(key[i], index_list);
                _out[i] = arr[key_index];

            }
            return _out;
        }
        static void Main(string[] args)
        {
            int[] a = { 120, 60, 50, 40, 30, 20 };
            int[] b = { 12, 29, 37, 85, 63, 11 };
            int[] c = { 30, 23, 90, 110, 21, 34 };
            int[,] a_index = { { 120, 0 }, { 60, 1 }, { 50, 2 }, { 40, 3 }, { 30, 4 }, { 20, 5 } };
            Array.Sort(a);
            b =Sort_by_index(b, a, a_index);
            c =Sort_by_index(c, a, a_index);
            Console.WriteLine("Result A");
            Console.WriteLine(string.Join(", ",a));
            Console.WriteLine("Result B");
            Console.WriteLine(string.Join(", ",b));
            Console.WriteLine("Result C");
            Console.WriteLine(string.Join(", ",c));
            Console.ReadKey(false);

        }
    }
于 2013-10-21T06:58:25.287 に答える
0

これには SortedList を使用できます。SortedList は、キーを使用して項目を並べ替えます。また、コレクションに新しいアイテムを追加することもできます。

SortedList Class: 
Represents a collection of key/value pairs that are sorted by the keys and are accessible by key and by index.

MSDNによるSortedList

于 2013-10-21T06:51:24.120 に答える