質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

3回答

9584閲覧

C# で for/foreach のかわりに Linq の All

y-o-r-o

総合スコア11

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

1クリップ

投稿2019/03/05 05:14

C# で for/foreach のかわりに(可能な限り)Linq の All を使用する者がいます。
使用者曰く「これといった副作用が無いから」とのこと。

// Using 'All' var dressed = people.Awake().Brush().All(x => { x.clothes = suit; return true; }); // Using 'foreach' var dressing = people.Awake().Brush(); foreach (var x in dressing) { x.clothes = suit; }

たしかにメソッドチェーンは見やすいとは思いますが、そもそも本来の All の意図を考えるとどうにも馴染めません。
はじめて当該コードを見たときは「?」でしたが、最後にあった「return true;」という一文を見てループしたいんだなと分かりました。

このような All の使用方法はわりと一般的なのですか?
速度について問われる場面ではなく、最終的な結果が同じならば、for/foreach のかわりに All を使用しても問題はないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

一般的ではないはずです。無駄なロジックが混ざって保守性を落としているので書き直すべきです。

どうしてもメソッドチェーンを使いたいならそのための拡張メソッドを書くのがいいですね。作ってあげたらどうですか?

投稿2019/03/05 05:30

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/03/05 05:39

people.Awake().Brush().Wear(suit).Execute() のようなメソッドチェーンを時々見ますが、これならいいと思います。条件を追加していって最後に確定するようなものですね。
y-o-r-o

2019/03/05 07:07

やはり避けるべきですよね。 質問の意図を的確に汲み取って回答頂きありがとうございました。
guest

0

All メソッドはシーケンスのすべての要素が条件を満たしているかどうかを判断ためのメソッドです。

本来の使用目的と異なる使い方すると可読性が落ちますので、このような書き方は避けるべきでしょう。

どうしても LINQ で書きたいのであれば、ForEach メソッドを使うべきかと思います。

C#

1var dressed = people.Awake().Brush().ToList().ForEach(x => 2{ 3 x.clothes = suit; 4});

投稿2019/03/05 06:10

編集2019/03/05 06:26
nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/03/05 06:16

ForEachはList<T>のメソッドなので、前に.ToList()を付けたほうがいいかと
nskydiving

2019/03/05 06:27

ご指摘ありがとうございます。 修正しました。
y-o-r-o

2019/03/05 07:47

> 本来の使用目的と異なる使い方すると可読性が落ちますので、このような書き方は避けるべきでしょう。 やはりこれを遵守すべきですよね。ご回答ありがとうございました。
guest

0

「これといった副作用が無いから」

peopleのclothesをsuitsにしているので、「副作用」しているように思います。こういうパターンではList.ForEachのようなものを使うのが普通に思います。

速度について問われる場面ではなく、最終的な結果が同じならば、for/foreach のかわりに All を使用しても問題はないのでしょうか?

問題のレベルによると思います。最終的な結果が同じ=問題はない、と考えることもできますし、保守性やリーダビリティまで問題に含めるなら問題ありだと思います。
(あくまで、foreachのかわりにLinqを使うことではなく、副作用させたいときに、Allを使うことが問題になり得るということです)

個人的には、Allでインスタンスを更新する開発者のコードは信用できないですね。他のところで、Allを使うことが適切であるところまで、疑ってかからないといけなくなるので。

投稿2019/03/05 05:44

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y-o-r-o

2019/03/05 07:06 編集

ご回答ありがとうございます。 例文が問題ありましたね、すみません。 「副作用が無い」というのは「他の問題が無い」という意味だと捉えました(発言者もおそらくその意味) なので、例文ではインスタンスのプロパティを更新していて誤解を招いてしまっていますが、単純にログを吐き出すだけでも構いません。聞きたかったことは「All は for の代替としていいのか?」です。 > 最終的な結果が同じ=問題はない、と考えることもできます この考え方がマズイと思うので今回質問させて頂きました。 > 保守性やリーダビリティまで問題に含めるなら問題あり やはりこれですね。 公式ドキュメントにも、 > Determines whether all elements of a sequence satisfy a condition. とあるのは分かっておりましたが、はたしてそれが一般的にどこまで守られているのか判断がつかなかったため質問させて頂きました。 (現在のチームのエンジニア2名がどちらもAllを乱用。ちなみに私はエンジニアではありません・・・)
papinianus

2019/03/05 07:18

> 単純にログを吐き出すだけ 一般にファイル出力は、副作用にあたります。IEnumerable<T>の要素の全てがlambdaの条件を見たすか否かの判定以外の処理をしている、というのが副作用の定義です。そのかたがやっていることこそ「副作用」であり、まさに「濫用」です。 > どこまで守られているか 赤信号みんなで渡れば怖くない理論だと思いますが、どんなにバッドノウハウが得られたとしても(得られませんでしたが)、MicrosoftDocにあわないコーディングはすべきではないです。
y-o-r-o

2019/03/05 07:40

本来の意図にそぐわない処理そのものが「副作用」ということですね。 プログラミングの副作用と一般的な副作用のニュアンスが違うので今回使用すべきワードではありませんでしたね。すみませんでした。
macof

2019/03/06 00:45

横からですいませんが1つ誤解がありそうなので失礼します。 一般的には副作用とは意図したかどうかには関係なく、式を評価した際に起きる状態変化を指すものです。 例えば代入演算子は代入を目的として使用しますが、 式としての評価結果は言語にもよりますが大抵は代入した値で、 変数内容の更新は副作用となります。 ファイル出力は出力先の状態を変化させるための処理なので原理的に副作用を持つというわけです。
y-o-r-o

2019/03/06 06:16

> Example side effects include modifying a non-local variable, modifying a static local variable, modifying a mutable argument passed by reference, performing I/O or calling other side-effect functions. Wikiにもありましたね。上記等の処理にて状態が変化することにより他に影響を与えてしまうことを副作用とするということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問