[解決済み] IEnumerableの複数列挙の可能性に関する警告の処理
質問
私のコードでは
IEnumerable<>
というReSharperのエラーが発生します。
IEnumerable
となります。
サンプルコードです。
public List<object> Foo(IEnumerable<object> objects)
{
if (objects == null || !objects.Any())
throw new ArgumentException();
var firstObject = objects.First();
var list = DoSomeThing(firstObject);
var secondList = DoSomeThingElse(objects);
list.AddRange(secondList);
return list;
}
-
を変更することができますね。
objects
パラメータをList
というように、複数の列挙の可能性を回避することができますが、その場合、私が扱うことができる最も高いオブジェクトを得ることはできません。 -
もうひとつは、このファイルを読み込むために
IEnumerable
からList
をメソッドの冒頭に追加しました。
public List<object> Foo(IEnumerable<object> objects)
{
var objectList = objects.ToList();
// ...
}
しかし、これはあくまで 不格好 .
このシナリオの場合、あなたならどうしますか?
解決方法は?
を取る際の問題点
IEnumerable
をパラメータとして使用すると、呼び出し側に "私はこれを列挙したい" と伝えることになります。これは、呼び出し元に対して、何回列挙したいのかを伝えるものではありません。
オブジェクトのパラメータをListに変更すれば、複数回の列挙を避けることができますが、その場合は 処理可能な最も高いオブジェクト .
最も高いオブジェクトを取るという目標は崇高ですが、あまりに多くの仮定を置く余地を残しています。LINQ to SQLクエリをこのメソッドに渡して、2回列挙して(毎回異なる結果を得る可能性がある)、本当にそうさせたいのでしょうか?
ここでのセマンティックな欠落は、呼び出し側がメソッドの詳細を読む時間を取らずに、あなたが一度だけ反復処理すると仮定し、高価なオブジェクトを渡すかもしれないということです。あなたのメソッドのシグネチャは、そのどちらかを示していません。
メソッドのシグネチャを
IList
/
ICollection
そうすれば、少なくとも電話をかけてきた人は、あなたの期待することが明確になり、お金のかかるミスを避けることができます。
そうでなければ、このメソッドを見た開発者の多くは、一度だけ反復処理をしていると思うかもしれません。もし
IEnumerable
が重要なのであれば
.ToList()
をメソッドの冒頭に置く。
.NETにIEnumerable + Count + Indexerで、Add/Removeなどのメソッドがないインターフェイスがないのは残念で、これがあればこの問題は解決すると思われます。
関連
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】プロセスが実行されているかどうかを知るには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】「namespace」なのに「type」のように使われる。