私は多くの作業ツールが好きなので、それらはいくつかの問題を解決しないだけでなく、そうでなければプログラムを
考慮し
ます 。 トゥーラ、私はあなたに伝えたい-それはそのようなものです。 CallSharr-私のプロジェクトが呼び出されます-入力と予想される出力データのセットに基づいて呼び出しのチェーンをアルゴリズム的に推定しようとしています。
まず、簡単な例:
"b"
があり、
"b"
を取得する必要があります。 上記では、これを模式的に示しましたが、さらに記事ではこのような見出しを使用し続けます。
この例は、問題を完全に示しています。なぜなら、 c。行にNOはReverse
Rvrs()
がなく、この問題の解決策は少数です。 たとえば、ここに書くことができます:
new string(input.Reverse().ToArray())
そのため、長い間入力データと出力データのためにこれらの呼び出しチェーンを推測したプログラムを受け取りたいと思います。 ちょっと幻想的ですね。
簡単な例から始めましょう:
この場合、
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"
と呼び、結果を確認します。 次の2つの関数のみが適切です。
input.ToUpper() input.ToUpperInvariant()
万歳、最初のミッションが完了しました!
理解する方法、右側の3番のタイプはどうですか? 私はここでそのようなアルゴリズムを提案します:
- 反射を通して、すべての型、つまり
ryrs()
メソッドを使用します。
- すべてのデータを呼び出します。 戻り値が
tru
場合、解決された(新説?)オブジェクトのボックス化を行い、それをbjt
としてbjt
ます。
- 入力は少なくとも
string
であることを忘れ string
。 入力の長さが1の場合、これもhr
です。
このアルゴリズムによれば、右側の3つは
string
と
hr
両方(
flt
または
imSn
さえも!)にすることができますが、現在の例では、これを
Int32
と同じにすることができます。
非静的メソッドを使用した同じ線形検索を使用して、即座に作業します
input.Length
このため、
gt_Lngth()
関数が
gt_Lngth()
が、CallSharrはユーザーの利便性のために不要な装飾をすべて削除します。
不正行為の例。 もっと
tru
、
IsNrmlizd()
落ちて
IsNrmlizd()
ので、非静的バージョンにはありません。 さらに、アルゴリズムを拡張する必要があります-ここで、古いメソッドを整理する必要があります。
- それらは必ずしもクラス(この場合は行)のメンバーではありませんが、少なくとも承認されたタイプのリストには含まれません。 理由:
Fil.Dlt()
を起動したくない
- 必要なタイプを展開します(この場合
bl
)
統計まで検索範囲を広げると、2つの完全に完璧な結果が得られました。
string.IsNullOrEmpty(input) string.IsNullOrWhiteSpace(input)
いいね! すでに別のことをしましょう!
Uxx、ここでは状況は良くなっています-
"b "
なので、最後に2つの問題があります:この1つの関数はまだ受信できません。 呼び出しチェーンを作成する必要があります。 この場合、チェーンは
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つ以上ある場合、多くの冗長な作業があり、プログラムを非常に印象的なものにします。
これまで、apgmentovなしで呼び出すことができる「素敵な」関数のみについて説明してきました。 すべて-そのようなことはそれ以上のことはしません。
bbb
を削除する
bbb
は、最後に何かを呼び出して
b
または
bbb
を切り取るか、テキストの最後の3文字を削除する必要があります。
すべての呼び出し側エージェントがオブジェクトと関連付けられている必要があり、これが呼び出しの原因となっています。 このために、ひどくひどい
Frgmnttinngin
-他の型を良い部分に分割する方法を知っているクラスの友達です。 (党からのマスターの写真がなければならない。)
行
bbb
見てみましょう。 次のように分割できます。
- すべての可能な文字(この場合
'b'
および'b'
)
- 可能なすべての素材(空の行を含む)。 これは本当につらい操作です。なぜなら それらの長い行に非常にあります。
- 行自体の長さの制限内のすべての可能な数。 これは
Substring()
を呼び出すために必要です。
オブジェクトの行を選択したら、これらのオブジェクトを受け取るメソッド(静的またはなし)を探しています。 ここからは、何かを除いてそれ以下です
- 2つ以上のエージェントを使用した呼び出しは、必死の組み合わせ爆発を引き起こします。 簡単な例は
Substring()
です。
rms[]
を受け取る関数呼び出しrms[]
理論的にはバーストによって制限されるものは何も生成しないため、すべてを制限するか、すべてを呼び出さないようにする必要があります。
CallSharrはもちろん、合成例で使用でき、提供されます
input.Trim('b') input.TrimEnd('b')
おそらく既に推測したように、組み合わせた爆発はファンに一致させることができ、他の多くのオプションは正しいのですが、不必要に複雑です。 例:
うーん、どうやらerまたは
と
r
別々に
r
だけでいいようです。 たとえば、CallSharrを実行すると、次のようになります
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つのオプションのみが使用したいものです。 残りはすべて不必要な情報を持っていますが、これは誰にも何もしません。 またはここに別の
以下のオプションがあります。ここにあります:
input.Replace("aabb", "aa") input.Replace("bb", "") input.Replace("bbcc", "cc")
上記の単一の正しいオプションは真ん中のものです。 意味論の観点から見ると、他の2つは正しいものであり、すべて同じです-むしろ、私たちが取得したいものではありません。
別の興味深い観察結果は、深さには興味深い解決策がありますが、表面にはない場合があることです。 例えば
ここでは問題を簡単に削除できますが、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ユーザーグループに関する私のレポートを以下に示し
ます 。
ご清聴ありがとうございました!