とあるQ&A系掲示板にあった質問:
学籍番号と得点(成績)の組:
record      (7, 345), (8, 678), (1, 123), ...
それと学籍番号の列:
target      { 4, 5, 3, 1, 2 };
があるとき、targetを得点順にソートせよ。
おもしろそーだったのでC++で解きました。
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
struct keyed_less {
  std::map<int,int>& ref;
  keyed_less(std::map<int,int>& r) : ref(r) {}
  bool operator()(int x, int y) const {
    return ref[x] < ref[y];
  }
};
int main() {
  int master[] = { 
    7, 345,
    8, 678,
    1, 123,
    2, 456,
    5, 567,
    6, 812,
    3, 781,
    4, 234,
  };
  std::map<int,int> record;
  for ( int i = 0; i < 8; ++i ) {
    record[master[i*2]] = master[i*2+1];
  }
  int no[5] = { 4, 5, 3, 1, 2};
  std::vector<int> target(no, no+5);
  std::sort(target.begin(), target.end(), keyed_less(record));
  for ( int i = 0; i < target.size(); ++i ) {
    std::cout << target.at(i) << '/' 
              << record[target.at(i)] << std::endl;
  }
  std::cout << std::endl;
}
C#だとこんなとこでしょか:
using System;
using System.Collections.Generic;
class Program {
  static void Main() {
    int[] master = { 
      7, 345,
      8, 678,
      1, 123,
      2, 456,
      5, 567,
      6, 812,
      3, 781,
      4, 234,
    };
    Dictionary<int,int> record = new Dictionary<int,int>();
    for ( int i = 0; i< 8; ++i ) {
      record.Add(master[i*2], master[i*2+1]);
    }
    int[] target = { 4, 5, 3, 1, 2 };
    Array.Sort(target, 
            delegate (int x, int y) { return record[x] - record[y];});
    Array.ForEach(target, 
            delegate (int x) { Console.WriteLine("{0}/{1}", x, record[x]); });
  }
}
匿名delegateってスゴイと思う♪