C# 利用lambda表达式构建的Comparison委托函数进行排序

基本示例

		Array.Sort(arr1, (x, y) =>
        {
        	//如果左参数>右参数,即需要左参数在右参数的后面
            if (x > y)
                return 1;

            //如果左参数<右参数,即需要左参数在右参数的前面
            else if (x < y)
                return -1;

            //如果左参数=右参数,
            else
                return 0;
        }
        );

进阶例题

力扣:1122. 数组的相对排序

题目

给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在arr1 的末尾。

示例 1:

输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]

示例 2:

输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出:[22,28,8,6,17,44]

我的题解:

public int[] RelativeSortArray(int[] arr1, int[] arr2)
    {
        //键为 arr2[index] ,值为前者在数组中的下标index
        Dictionary<int, int> arr2_dic = new Dictionary<int, int>(arr2.Length);

        for (int i = 0; i < arr2.Length; i++)
        {
            arr2_dic.Add(arr2[i], i);
        }

        Array.Sort(arr1, (x, y) =>
        {
            //如果左参数>右参数,即需要左参数在右参数的后面

            //如果 x 和 y 都在 arr2 里
            if (arr2_dic.ContainsKey(x) && arr2_dic.ContainsKey(y)) {
                return arr2_dic[x] - arr2_dic[y];
            }
            //如果 x 和 y 都不在 arr2 里
            else if (!arr2_dic.ContainsKey(x) && !arr2_dic.ContainsKey(y)) {
                return x - y;
            }
            //如果一个在一个不在
            else {
                return arr2_dic.ContainsKey(x) ? -1 : 1;
            }
        }
        );

        return arr1;
    }

上述题解引用的库函数为:public static void Sort(T[] array, Comparison comparison)

其他说明

  1. Array.Sort() 采用内省排序(introspective sort)参考链接
  2. 这两篇文章的末尾提到了多种利用库函数对集合进行排序的方式:参考链接1、参考链接2
  3. 第二点提到的排序有“通过IComparer对集合排序”,基本示例:
public class mySort : IComparer
    {
        int IComparer.Compare(System.Object x, System.Object y)
        {
            int a = (int)x;
            int b = (int)y;

            /*
            如果左参数>右参数,即需要左参数在右参数的后面
            return 1;

            如果左参数<右参数,即需要左参数在右参数的前面
            return -1;
            
            如果左参数=右参数,
            return 0; 
            */
        }
    }
    
    //调用方式
    void Start()
    {
        int[] a = new int[] { };
        Array.Sort(a,new mySort());
    }