![](https://habrastorage.org/files/393/f89/b7b/393f89b7b2354847aabec1af459c890e.png)
![" abc"⟶" cba"](https://habrastorage.org/files/b55/633/eb2/b55633eb277e41dca453278d67a383d5.png)
まず、簡単な例:
"b"
"b"
この例は、問題を完全に示しています。なぜなら、 c。行にNOはReverse
Rvrs()
new string(input.Reverse().ToArray())
そのため、長い間入力データと出力データのためにこれらの呼び出しチェーンを推測したプログラムを受け取りたいと思います。 ちょっと幻想的ですね。
簡単な例から始めましょう:
![abc⟶ABC](https://habrastorage.org/files/496/4a4/168/4964a416804848638a9c6997843e99db.png)
この場合、
b
b
.Netの行は不変であり、呼び出し後に元の行への変更をチェックする必要はありません-最高値のみです。 したがって、すべてのメソッド(および、存在しないプロパティ。メソッド
gt_
gt_
- クラス
string
非静的メソッド(Systm.String
、ロマンチックな場合)
- 1人のエージェントを受け入れることはできません
- 行を展開する
「アポメントの1つを受け入れない」かもしれないことは注目に値する-これらは3つの別々のケースであり、
- この関数には一般的なパラメーターはありません。
F()
- この関数はパラメーターを使用できますが、すべてにデフォルト値があります。
F(int n = 0)
- 関数にはアンパックされたリストがあります。
F(rms hr[] lttrs)
これらの基準に
"b"
"b"
string
Normalize ToLower ToLowerInvariant ToUpper ToUpperInvariant ToString Trim TrimStart TrimEnd
これらの各関数を
"b"
input.ToUpper() input.ToUpperInvariant()
万歳、最初のミッションが完了しました!
![abc⟶3](https://habrastorage.org/files/6ab/7e6/228/6ab7e62286fa4c608deeef69f6e31a0e.png)
理解する方法、右側の3番のタイプはどうですか? 私はここでそのようなアルゴリズムを提案します:
- 反射を通して、すべての型、つまり
ryrs()
メソッドを使用します。
- すべてのデータを呼び出します。 戻り値が
tru
場合、解決された(新説?)オブジェクトのボックス化を行い、それをbjt
としてbjt
ます。
- 入力は少なくとも
string
であることを忘れstring
。 入力の長さが1の場合、これもhr
です。
このアルゴリズムによれば、右側の3つは
string
hr
flt
imSn
Int32
非静的メソッドを使用した同じ線形検索を使用して、即座に作業します
input.Length
このため、
gt_Lngth()
gt_Lngth()
![abc⟶false](https://habrastorage.org/files/85d/280/524/85d280524d644b98b3b5beea61274baf.png)
不正行為の例。 もっと
tru
IsNrmlizd()
IsNrmlizd()
- それらは必ずしもクラス(この場合は行)のメンバーではありませんが、少なくとも承認されたタイプのリストには含まれません。 理由:
Fil.Dlt()
を起動したくない
- 必要なタイプを展開します(この場合
bl
)
統計まで検索範囲を広げると、2つの完全に完璧な結果が得られました。
string.IsNullOrEmpty(input) string.IsNullOrWhiteSpace(input)
いいね! すでに別のことをしましょう!
![abc⎵⎵⟶ABC](https://habrastorage.org/files/0db/7b2/b65/0db7b2b65a2b4477be92ebf0daaf874f.png)
Uxx、ここでは状況は良くなっています-
"b "
string
string
string
string
o oo
string
この段階で、複合爆発が発生します。 さて、あなたは何が欲しいのですか? 次に、他の多くの入力データについて説明します。多くのオプションがあります。
string.Concat(input.Split()).ToUpper() string.Concat(input.Split()).ToUpperInvariant() input.ToUpper().Trim() input.ToUpper().TrimEnd() input.ToUpperInvariant().Trim() input.ToUpperInvariant().TrimEnd() input.Trim().ToUpper() input.Trim().ToUpperInvariant() input.TrimEnd().ToUpperInvariant() input.TrimEnd().ToUpper() // + lots more solutions
私はすべての解決策、そしてそれらの多くを解決し始めませんでした。 ご覧のとおり、すべてのオプションは多かれ少なかれ正しいですが、呼び出しの可換性を考慮していませんでした。
.rim().Ur()
これは、2を呼び出すときのひどい問題ではありませんが、3つ以上ある場合、多くの冗長な作業があり、プログラムを非常に印象的なものにします。
![aaabbb⟶aaa](https://habrastorage.org/files/2c0/50f/2ca/2c050f2ca65f4887adeda812a6713ed7.png)
これまで、apgmentovなしで呼び出すことができる「素敵な」関数のみについて説明してきました。 すべて-そのようなことはそれ以上のことはしません。
bbb
bbb
b
bbb
すべての呼び出し側エージェントがオブジェクトと関連付けられている必要があり、これが呼び出しの原因となっています。 このために、ひどくひどい
Frgmnttinngin
行
bbb
- すべての可能な文字(この場合
'b'
および'b'
)
- 可能なすべての素材(空の行を含む)。 これは本当につらい操作です。なぜなら それらの長い行に非常にあります。
- 行自体の長さの制限内のすべての可能な数。 これは
Substring()
を呼び出すために必要です。
オブジェクトの行を選択したら、これらのオブジェクトを受け取るメソッド(静的またはなし)を探しています。 ここからは、何かを除いてそれ以下です
- 2つ以上のエージェントを使用した呼び出しは、必死の組み合わせ爆発を引き起こします。 簡単な例は
Substring()
です。
-
rms[]
を受け取る関数呼び出しrms[]
理論的にはバーストによって制限されるものは何も生成しないため、すべてを制限するか、すべてを呼び出さないようにする必要があります。
CallSharrはもちろん、合成例で使用でき、提供されます
input.Trim('b') input.TrimEnd('b')
おそらく既に推測したように、組み合わせた爆発はファンに一致させることができ、他の多くのオプションは正しいのですが、不必要に複雑です。 例:
![猫猫](https://habrastorage.org/files/504/32c/46e/50432c46ed364db0a40f8bb585cdf7b3.png)
うーん、どうやらerまたは
r
r
input.Trim('e','r') input.Trim('r','e') input.Trim('a','e','r') input.Trim('a','r','e') input.Trim('e','a','r') input.Trim('e','r','a') input.Trim('r','a','e') input.Trim('r','e','a') input.TrimEnd('e','r') input.TrimEnd('r','e') // 30+ more options
ご覧のとおり、最初の2つのオプションのみが使用したいものです。 残りはすべて不必要な情報を持っていますが、これは誰にも何もしません。 またはここに別の
![aabbcc⟶aacc](https://habrastorage.org/files/8f2/a21/6b6/8f2a216b67454a21a1fe0d56857d6ff4.png)
以下のオプションがあります。ここにあります:
input.Replace("aabb", "aa") input.Replace("bb", "") input.Replace("bbcc", "cc")
上記の単一の正しいオプションは真ん中のものです。 意味論の観点から見ると、他の2つは正しいものであり、すべて同じです-むしろ、私たちが取得したいものではありません。
別の興味深い観察結果は、深さには興味深い解決策がありますが、表面にはない場合があることです。 例えば
![a⎵b⎵c⟶abc](https://habrastorage.org/files/cb7/499/3ec/cb74993ec70e4f3aa509f024806ec356.png)
ここでは問題を簡単に削除できますが、CallSharrには多くのオプションがあります。たとえば、
input.Replace(" ", string.Empty) input.Replace(" b ", "b") input.Replace("ab ", "ab") input.Replace(" b c", "bc") input.Replace("ab c", "abc") // at greater depth, string.Concat(input.Split())
最良のオプションは最初であり、おそらく最後のオプションです。実行ポイントと同時にあるはずです(おそらく、チェックしなかったと直感が伝えます)が、エレガンのように見えます。 これは良い例です。プログラムは、人がすぐに見ないことを推測できるからです。
要約する
現在、SallSharrは高速ではなく動作します。 問題は、主にリフレクション(特に
thdInf.Invk()
パフォーマンスに関する現在の問題は、動的から静的に移行するときに解決されます(T4ですべて実行してください)。 多くの最適化を行うことができます。たとえば、次のような関数セットとして「可換性」の分析を行いたいと思います。
CallSharr-鉱石ソースプロジェクト、 GitHubにあります 。 また、そのリリースもあります -新しいバージョンのリリースに必要なものがすべて含まれているSmall One をインストールするには、 ここをクリックしてください 。
少し活気のあるナレーションが必要な方のために、 サンクトペテルブルクの.NETユーザーグループに関する私のレポートを以下に示します 。
ご清聴ありがとうございました!