8

LINQ のおかげで非常に多くの機能を利用できるようになったので、どの構文が適しているのか疑問に思っています。たとえば、次の方法を見つけました (良い例だと思いました)。

foreach (FixtureImageServicesData image in _fixture.Images)
{
    if (image.Filename != _selectedFixtureImage.Filename && image.IsPrimary)
    {
        image.IsPrimary = false;
        image.IsChanged = true;
    }
}

これを LINQ アプローチに変換すると、次のようになります (テストされていません)。

_fixture.Images.Where(x => x.Filename != _selectedFixtureImage.Filename && x.IsPrimary).ForEach(x => { x.IsPrimary = false; x.IsChanged = true; });

どちらを見て維持したいですか? これはクレイジーですか、それとも天才ですか?

4

3 に答える 3

22

拡張メソッドを使用してForEachも問題ありませんが、中間のアプローチがあります。

// Rename 'query' to something meaningful :)
var query = _fixture.Images
                    .Where(image => _selectedFixtureImage.Filename 
                                    && image.IsPrimary);

foreach (FixtureImageServicesData image in query)
{
    image.IsPrimary = false;
    image.IsChanged = true;
}

メソッドを使用する場合ForEach、間違いなく複数行でフォーマットします。

_fixture.Images
    .Where(image => _selectedFixtureImage.Filename && image.IsPrimary)
    .ForEach(image => { image.IsPrimary = false; image.IsChanged = true;});

(折り返しを避けるためにインデントを減らしました...)

また:

_fixture.Images
        .Where(image => _selectedFixtureImage.Filename && image.IsPrimary)
        .ForEach(image => { image.IsPrimary = false; 
                            image.IsChanged = true; });

「非プライマリにする」ビットを別のメソッドに抽出することもできます。その時点で、次のようになります。

_fixture.Images
        .Where(image => _selectedFixtureImage.Filename && image.IsPrimary)
        .ForEach(MakeNonPrimary);
于 2009-02-25T14:38:52.120 に答える
2

これは、「Regex または標準の文字列関数を使用する必要があるか」または「XSLT/XPATH を使用して XML を変換するか、SelectSingleNode() を使用する必要があるか」を少し思い出させます。

最初のオプション (つまり、Regex/XSLT/Linq) は、時間をかけて学習した人なら、よりエレガントで強力であると考えることがよくあります。

他のすべての人にとっては、2 番目のオプション (つまり、文字列関数、SelectSingleNode()、単純な foreach ループ) と比較すると、読みにくく、より複雑に見えます。

過去に、私は自分の設計で Regex と XSLT/XPATH を使用することで物事を複雑にしすぎていると非難されてきました。

つい最近、Linq Where、Foreach などよりも多くの状況で単純な foreach (さらには for) ループを好むことで、「変化が怖い」と非難されました。

どちらの場合も、そう言った人たちは、すべてを行うには「1つの方法」があると感じている人であることにすぐに気付きました.

私は常に、それぞれの状況をそのメリットについて検討し、仕事に適したツールを選択する方がはるかに賢明であることに気付きました. 私はそれらを無視して、私のアプローチを続けます;)

あなたが説明したその状況では、最初のオプションが私にとってより好ましいです。ただし、チーム全員が Linq に対応していて、大きなワンライナーを避けるためのコーディング ガイドラインがあれば (分割して)、おそらく Linq アプローチを使用するでしょう。

于 2009-02-25T15:05:18.950 に答える
1

垂直または水平の複雑さを軽減するものはすべて、私にとってプラスです。さらに、Linq は、達成しようとしていることをより詳しく説明しています。

于 2009-02-25T14:38:59.357 に答える