Здесь нет ярлыка, если только списки не отсортированы, и в этом случае вы можете сравнить элементы один за другим. И, очевидно, я предполагаю, что порядок не имеет значения, иначе очевидно, что вы можете сравнивать их по очереди и тогда.
В противном случае, я бы предположил, что наиболее эффективным алгоритмом, который вы могли бы получить для больших списков элементов, было бы что-то вроде этого, с использованием хеш-таблицы для отслеживания того, что вы видели (предупреждение: не проверял, но должно быть ясно, к чему я клоню.)
public static bool IsEqual<T>(this List<T> x1, List<T> x2)
{
if(x1.Count != x2.Count) return false;
var x1Elements = new Dictionary<T, int>();
foreach(var item in x1)
{
int n; x1Elements.TryGetValue(item, out n);
x1Elements[item] = n+1;
}
foreach(var item in x2)
{
int n; x1Elements.TryGetValue(item, out n);
if(n <= 0) return false; // this element was in x2 but not x1
else x1Elements[item] = n-1;
}
// make sure x1 didn't have any elements
// that weren't in x2
return x1Elements.Values.All(x => x == 0);
}