2

文字列の配列があり、その配列に特定の文字列が含まれていないかどうかを確認したいと考えています。次のように、Contains メソッドと組み合わせて not 演算子 (!) を使用できます。

if (!stringArray.Contains(searchString))
{
    //do something
}

not 演算子 (!) は、コードをスキャンするときに見落とされる可能性があるため、読みやすさを向上させるために Extension メソッドを作成することは悪い習慣と見なされるのではないかと考えていました。

public static bool DoesNotContain<T>(this IEnumerable<T> source, T value)
{
    return !source.Contains<T>(value);
}

したがって、コードは次のようになります。

if (stringArray.DoesNotContain(searchString))
{
    //do something
}

このようなことは眉をひそめていますか?

4

12 に答える 12

4

! を維持します。これは、行の上のコメントが読みやすくなる場所です。
( ! の方が効率的だと思います)

//If the word is NOT in the array then...

もう 1 つのポイントは、アレイの使用に固執しているかどうかです。と呼ばれるものがあります (知っているかもしれないし知らないかもしれません) HashSet

文字列がリストに含まれているかどうかを調べることが唯一の目的である場合、基本的に集合演算を見ています。

特定の用語が含まれているかどうかを調べる以外の目的で配列を使用している場合を除き、HashSet...はるかに高速に使用してみてください。

于 2010-12-01T16:51:15.713 に答える
4

個人的には、これほど単純なものに対して拡張メソッドを作成するつもりはありません。読みやすくしようとしているのは理解できますが、ほとんどの C# 開発者は ! をキャッチする必要があります。オペレーター。頻繁に使用され、初心者でも通常は認識されます。

于 2010-12-01T16:46:08.210 に答える
3

私は間違いなくを使用し!stringArray.Contains(string)ます。これは、すべての開発者の99.9%が使用しているものです。DoesNotContain少なくとも私を混乱させるでしょう。

于 2010-12-01T16:49:57.110 に答える
3

不必要に思え!source.Contains<T>(value);ますが、かなり読みやすいです。また、既存のContains関数を使用すると、コードの移植性が向上します (つまり、存在する拡張メソッドに依存しなくなります)。

于 2010-12-01T16:47:04.477 に答える
3

あなたの質問は少し間違った前提に基づいていると思います。つまり、開発者は!コード内の を読み飛ばします。ブール演算子は、!多数の一般的なプログラミング言語 (C、C++、C#、Java など) で非常によく知られている演算子です。定期的に過去の記事を読む可能性が高い人は、!事前に十分なレビューを行わずにコードをチェックインするべきではありません。

次のように言っているような気がします

人々に C# でコードを書いてもらいたいのですが、彼らがそれを読むとは思えないので、拡張メソッドを使用してコード ベースに新しい方言を作成します。

!なぜオペレーターを止めるのですか?+彼らがin式を見落としたり、 aを a と+=読んだりする可能性も同じように思われます。 |||

于 2010-12-01T16:53:59.273 に答える
2

これは悪い考えのように聞こえます。コードの利用者は、1つではなく2つのメソッド(DoesNotContainおよび)について知っている必要があります。Contains一般的に、私はXXNotXXメソッドを避けます。

于 2010-12-01T16:49:13.750 に答える
2

.NET フレームワークで DoesNot* メソッドを見たことがないので、! の問題だと思います。過大評価されています。

于 2010-12-01T16:47:04.080 に答える
2

これは、良い/悪い習慣というよりも、個人的な選択だと思います。IMO 私は拡張メソッドが好きです。なぜなら、より宣言的で読みやすいからです。一見しただけで、それが何をするのかが正確にわかります。ちょうど私の2セント

于 2010-12-01T16:47:54.530 に答える
1

オプション2よりもオプション1の方が好きです。拡張メソッドは非常に優れており、頻繁に使用される変換や比較などに使用するのに最適です。ただし、Microsoftは拡張メソッドを慎重に使用することをお勧めします。

于 2010-12-01T17:19:18.707 に答える
1

プロジェクト内で頻繁に使用する場合は、個人的に拡張メソッドを作成します。それが1回限りの場合、私は気にしないでしょうが、それは本当に悪い習慣ではありません。

私がそれを行う理由は、if()が何が起こっているかについて一目でより多くのコンテキストを持っているからです。脳細胞を持っている人なら誰でも、現在のステートメントが何をしているのかを知っているだろうと認めましたが、それはもっと読みやすくなっています。誰もが自分の好みを持っているでしょう...

コードフローを改善するためだけに文字列をフォーマットするための拡張メソッドを作成しました...

于 2010-12-01T16:50:15.233 に答える
1

私は、式を否定する以外に何もしない拡張メソッドを悪い習慣と考えています。

どうですか:

if (stringArray.Contains(searchString) == false)
{
    //do something
}
于 2010-12-01T17:30:27.417 に答える
1

うまくいかないとき!somethingは、 に戻りsomething == falseます。

于 2010-12-01T16:53:45.140 に答える