3

私はResharperを使用しており、次のような数行のコードを作成すると、次のようになります。

foreach (var posCombination in possibleCombinations)
{
    if (posCombination .Count == combo.Count && posCombination .Select((l, i) => combo.Contains(l)).All(b => b))
    {
        return true;
    }
}

return false;

LINQ式に変換するかどうかを尋ねられます。

return possibleCombinations.Any(possibleCombination => 
     possibleCombination.Count == combo.Count 
  && possibleCombination.Select((l, i) => combo.Contains(l)).All(b => b));

多くの人に、LINQステートメントで何が起こっているのかを読むのに苦労していると言われました...では、コードが読みにくくなるのであれば、なぜそれをLINQ式に変換したいのでしょうか。

4

4 に答える 4

6

これは完全にあなた次第です。自分自身を含むコードの読者がより冗長なスタイルを好む場合は、必ずそれを維持してください。読みにくい賢いコードは、CPU時間よりもプログラマーの時間の方がはるかに高価です。結局のところ、それはReSharperのヒントにすぎません。注意を払うか無視するかは完全にあなた次第です。

LINQコードの読み取りは、時間の経過とともに簡単になります(私にとってははるかに簡単になりましたが、LINQコードを記述し、他のチームメンバーが記述したLINQコードを確認するのにかなりの時間がかかりました)。特に有用だと思ったのはコメントです。LINQ式は短いコード行に驚くほどの量の情報を収めることができるので、私が書いた行に出くわしたときに意味を理解するのに、平易な英語で意図を綴るのに役立ちます。数ヶ月前。

于 2012-09-29T14:38:49.383 に答える
3

すでにLINQ式、つまりコードのこの部分を使用しています。

posCombination.Select((l, i) => combo.Contains(l)).All(b => b)

だからあなたはあなた自身の質問に答えることができるかもしれません。そこでLINQ式を使用することにしたのはなぜですか?

これは、LINQ式自体よりも、ReSharperが提案する問題の方が多いと思います。他の人が言っているように、それらは単なる提案であり、それらをどうするかを決めるのはあなた次第です。この特定の提案をクリーンアップする必要があると思います。そうすれば、コードが読みやすくなります。まず、呼び出し元のコレクションからそれが何であるかを推測できるため、lamda式のパラメーター名を短くする必要があります。次に、元のLINQ式を次のように簡略化できます。

posCombination.All(x => combo.Contains(x))

結果のLINQ式は次のとおりです。

return possibleCombinations.Any(p => p.Count == combo.Count && 
                                     p.All(x => combo.Contains(x)));

これで、ループの内部を調べる必要のない、簡潔でありながら説明的なコード行になりました。もちろん、これはまだ単なる提案です。必要に応じて、よりわかりやすいパラメーター名を使用したり、読みにくい部分をメソッドに抽出したり、コメントを追加したり、元のコードを使用したりできます。

于 2012-09-29T16:02:16.253 に答える
0

代わりに、ヒントを提供するようにResharperを設定できます。あなたはそれがするすべての提案に従う必要はありません、そして正直に言うとそれはかなり迷惑になることがあります。

return possibleCombinations.Any(possibleCombination => possibleCombination.Count == combo.Count && possibleCombination.Select((l, i) => combo.Contains(l)).All(b => b));

Resharperのアドバイスをいつ受けるべきでないかについての例です。誰もがLinqの第一人者というわけではありません。私は、インターンと一緒に仕事をしているときにこれを知っています。彼らは私のLinqコードが何をするのかと私に尋ね続けました、そして私のメンターでさえそれが好きではありませんでした。コードをシンプルで読みやすくして、保守を容易にすることをお勧めします。

達成しようとしていることが非常に明白な場合は、Linqを使用してください。

うんざりしている場合のResharperの設定方法。

于 2012-09-29T14:35:00.573 に答える
0

多くの人に、LINQステートメントで何が起こっているのかを読むのに苦労していると言われました...では、コードが読みにくくなるのであれば、なぜそれをLINQ式に変換したいのでしょうか。

問題は、開発者が非常に長い間慣れているため、既存のコードが読みやすいように見えることです。LINQ構文は比較的新しいものです(DBクエリを除く)。

最初は単純なLINQ式でさえ理解するのに苦労していましたが、練習すればそれが大好きです。一部のLINQ式が単純にあいまいであるという事実を否定していません(例:Aggregate)これで、複雑なクエリを簡単に記述できます。

なぜLINQ式を使用する必要があるのですか?コードを簡素化し(LOCを削減)、強力な構造(並べ替え、フィルタリング、グループ化、遅延読み込みなど)を提供します。

于 2012-09-29T15:14:31.463 に答える