Рассмотрим два фрагмента кода, которые просто упорядочивают строки в C#
и F#
соответственно:
С#:
var strings = new[] { "Tea and Coffee", "Telephone", "TV" };
var orderedStrings = strings.OrderBy(s => s).ToArray();
F #:
let strings = [| "Tea and Coffee"; "Telephone"; "TV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> Seq.toArray
Эти два фрагмента кода возвращают разные результаты:
- С#: чай и кофе, телефон, телевизор.
- F #: телевизор, чай и кофе, телефон.
В моем конкретном случае мне нужно сопоставить логику упорядочения между этими двумя языками (один - это производственный код, а один - часть тестового утверждения). Это вызывает несколько вопросов:
- Есть ли основная причина различий в логике заказа?
- Каков рекомендуемый способ преодоления этой "проблемы" в моей ситуации?
- Является ли это явление специфичным для строк, или оно относится к другим типам .NET тоже?
ИЗМЕНИТЬ
В ответ на несколько комментариев зондирования, запуск фрагментов ниже показывает больше о точной природе различий этого упорядочения:
F #:
let strings = [| "UV"; "Uv"; "uV"; "uv"; "Tv"; "TV"; "tv"; "tV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> Seq.toArray
С#:
var strings = new[] { "UV", "Uv", "uv", "uV", "TV", "tV", "Tv", "tv" };
var orderedStrings = strings.OrderBy(s => s).ToArray();
дает:
- С#: tv, tV, Tv, TV, uv, uV, Uv, UV
- F #: TV, Tv, UV, Uv, tV, tv, uV, uv
Лексикографическое упорядочение строк отличается из-за разницы в базовом порядке символов:
- С#: "aAbBcCdD... tTuUvV..."
- F #: "ABC..TUV..Zabc..tuv.."