6

私は以下のステートメントを使用しています。MachineListを持つコレクション(タイプIEnumerable)MachineStatus。のMachineListコレクションには、常にステータスが次のマシンが含まれるわけではありません

どのマシンにもMachineStatus空のコレクションを返したいのですが。私の電話ActiveMachines(最初に使用されます)は動作しますがInactiveMachinesではない。

public IEnumerable<Machine> ActiveMachines
{
    get
    {
        return Customer.MachineList
            .Where(m => m.MachineStatus == "a");
    }
}

public IEnumerable<Machine> InactiveMachines
{
    get
    {
        return Customer.MachineList
            .Where(m => m.MachineStatus == "i");
    }
}

編集する

さらに調べてみると、MachineListの次の列挙を引き起こしますMachineList欺瞞を投げる:Object reference not set to an instance of an object

したがって、電話がかかってきたかどうかは関係ありません。ActiveMachinesまたはInactiveMachinesその問題としてMachineListコレクション。私はに電話を切ることができるのでこれは特に厄介ですMachineListコードで呼び出される前に、単にWatchでそれを列挙することによって。最低レベルMachineList実装するNHibernate.IQueryとして返されるIEnumerable。原因は何ですかMachineList最初の列挙後にその内容を失うのですか?


  • いいえ、列挙時に特別なことは何も起こりません。何が「非アクティブ」であるかを確認するのは興味深いでしょう。などがデバッガにあります。私も(例えば)かどうか疑問に思うMachineStatus例外をスローしているファサードプロパティです - すなわちpublic string MachineStatus { get {return someInnerField.Status;}}そしてsomeInnerFieldですnull。 - Marc Gravell
  • 本当の問題はあなたがを列挙しているということですIEnumerable複数回。消費するときに同意する暗黙の契約IEnumerable一度だけ列挙することです。だから、本当の答えはあなたの同僚が複数の列挙を許すように彼のコードを変更することではありません、しかしあなたがするためにCustomer.MachineList.ToList()ある時点で、その後は結果のリストのみを使用します(または、新しいリストを取得します。IEnumerable再び)。あなたは怠惰な評価をすることができます。キャッシュすることはできますが、2回列挙しないでください。を公開することもできますIQueryableそしてそれも複数回呼び出します。 - ErikE

3 답변


7

Where一致がない場合は空のシーケンスを返します。これは完全に有効なシーケンスです(nullではありません)。あなたがnullを取得する唯一の方法はあなたが呼び出す場合です。FirstOrDefaultまたはSingleOrDefault

バグはあなたがそれがあると思う場所にあると確信していますか?

int?[] nums = { 1, 3, 5 };
var qry = nums.Where(i => i % 2 == 0);
Console.WriteLine(qry == null); // false
Console.WriteLine(qry.Count()); // 0
var list = qry.ToList();
Console.WriteLine(list.Count); // 0
var first = qry.FirstOrDefault();
Console.WriteLine(first == null); // true


  • それが私が考えたことです。同じエラーが発生するような修正を反映するように質問を修正しました。 - ahsteele
  • 何が起こっているのかを明らかにする可能性のある追加情報を私の質問に追加しました。そうは言っても、私は私が新しいスレッドを開く必要があることに接しているのではないかと思います。 - ahsteele
  • エラーはMachineListが構築されていた方法でやらなければなりませんでした。この方法を他の開発者から使用していたため、その方法が確認されていませんでした。私は正しい場所を見ていたと確信しているかどうか尋ねることによって私を正しい方向に向けてくれてありがとう。 - ahsteele

4

デフォルトでは、列挙型すでに空を返しますIEnumerable<T>nullではありません。 「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示される場合。例外は、他の何かが問題である可能性が最も高いです。

MachineListはnullでしょうか。作成していない場合は、への呼び出しで例外が発生します.Where(...)


  • 私は正しい場所を見ていたと確信しているかどうか尋ねることによって私を正しい方向に向けてくれてありがとう。 - ahsteele

2

さらに、空のコレクションを明示的に返したい場合は、これが役立ちます。

Enumerable.Empty<Machine>();

リンクされた質問


関連する質問

最近の質問