Если вы используете .NET 4 (и это не похоже на вас), я думаю, вы могли бы сделать что-то умное с Enumerable.Zip . Что-то вроде:
var r = x.Zip(y, comparer.Compare).FirstOrDefault(c => c != 0);
хотя сейчас я не вижу, как эффективно справиться со случаем, когда более короткий и такой же длинный и длинный.
Редактировать : Если вы сравниваете только массивы (или иначе не хотите измерять свои коллекции дважды), тогда я думаю, что вы можете просто добавить:
if (r == 0) {
r = int.Compare(x.Count(), y.Count());
}
Вы можете даже объединить их как:
var r = x.Zip(y, comparer.Compare)
.Concat(new [] { int.Compare(x.Count(), y.Count()) })
.FirstOrDefault(c => c != 0)
(А если вы используете .NET 3.5, то добавьте метод расширения Zip, потому что его легко написать и он очень полезен везде! Я не знаю, почему он не был включен в первоначальный выпуск Linq .)