TypeScriptからC#へ、プログラム(NormalizeJapaneseAddressesNET)を移植していました。
はまったところをメモします。
正規表現の解釈が異なる
TypeScript(JavaScript)と、.NETとでは、正規表現の解釈が異なる場合があります。
正規表現でのReplace
JavaScriptでは、次の場合、1回のみの置換です。C#で対応するコードは工夫が必要です。
- 正規表現で、文字列のReplaceを行う
- 正規表現は、gフラグ(globalフラグ)が無い。
TypeScript
const _pref = pref.replace(/(都|道|府|県)$/, '')
C#
var r = new Regex("(都|道|府|県)$");
var _pref = r.Replace(pref, "", 1);
1は置換する回数です。1回のみ置換します。
number型
JavaScript
numberの、整数の場合の最大値・最小値です。
const biggestInt = Number.MAX_SAFE_INTEGER; // (2**53 - 1) => 9007199254740991
const smallestInt = Number.MIN_SAFE_INTEGER; // -(2**53 - 1) => -9007199254740991
numberを、整数として扱い、整数としての範囲に対応するなら、C#では、integerでは範囲が狭く、代わりにlongを利用するので良いはずです。
C#
int -2,147,483,648 ~ 2,147,483,647
long -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807
安定ソート
TypeScript
towns.sort((a, b) => {
let aLen = a.town.length
let bLen = b.town.length
return bLen - aLen
})
JavaScriptの、ArryのSortは、ECMAScript 2019から、安定ソートです。
C#
これを、C#にそのまま移植すると次になります。しかし、安定ソートではありません。
towns.Sort((a, b) =>
{
var aLen = a.town.Length;
var bLen = b.town.Length;
return bLen - aLen;
});
安定ソートにするには、OrderByを利用します。
var comparer = new TownsComparer();
towns = towns.OrderBy(x => x, comparer).ToList();
public class TownsComparer : IComparer<SingleTown>
{
public int Compare(SingleTown a, SingleTown b)
{
var aLen = a.town.Length;
var bLen = b.town.Length;
if (bLen > aLen)
return 1;
else if (aLen == bLen)
return 0;
else
return -1;
}
}