6

どういうわけかそれを単純化することが可能であれば、私は本当に好きではないコードの一部を持っています - 本当にいいでしょう.

A a; // I want to get rid of this variable
if((a = collection.FirstOrDefault(x => x.Field == null)) != null)
{
  throw new ScriptException("{0}", a.y); //I need to access other field of the object here, that's why I had to declare a variable outside of the expression
}
4

7 に答える 7

7

変数の代入と定義を組み合わせれば、コードをより読みやすくすることができます。

A a = collection.FirstOrDefault(x => x.Field == null);

if(a != null)    
   throw new ScriptException("{0}", a.y);
于 2013-10-23T15:21:27.850 に答える
7

一致する最初のアイテムを見つけて処理するのではなく、結果をコレクションとして扱います。 foreachを使用して一致するすべてのアイテムに対してWhere。例外によってループから戻るため、最終結果は同じですが、コードがよりクリーンになります。

foreach(var a in collection.Where(x => x.Field == null))
    throw new ScriptException("{0}", a.y);

ループが最大で 1 回しか実行されないことを読者に明確にしたい場合はTake、そこに呼び出しを追加して、機能を変更せずにコードを明確にすることができます。

foreach(var a in collection.Where(x => x.Field == null).Take(1))
    throw new ScriptException("{0}", a.y);

これにより、最初のアイテムではなく、すべての無効なアイテムを簡単に集約できます。

var exceptions = collection.Where(a => a.Field == null)
    .Select(a => new ScriptException("{0}", a.y))
    .ToList();
if (exceptions.Any())
    throw new AggregateException(exceptions);
于 2013-10-23T15:21:31.280 に答える
2

if変数の外側に代入してから内側の値を参照する必要があるため、変数の宣言を避けることはできません。(唯一の方法は、フィルターを 2 回実行することであり、コストがかかる可能性があります)。

とはいえ、これを利用してコードを読みやすくすることができます。

A a = collection.FirstOrDefault(x => x.Field == null); // assign here
if(a != null) // more easily-readable comparison here
{
  throw new ScriptException("{0}", a.y); 
}
于 2013-10-23T15:23:08.800 に答える
1

この状態では手放せませんA a。後で使用するために、LINQ ステートメントから返された値を格納する必要があります。また、usingブロックとは異なり、ifステートメントでは式で変数を定義できません。

個人的には、次のようにします。

A a = collection.FirstOrDefault(x => x.Field == null);
if(a != null)
{
    throw new ScriptException("{0}", a.y);
}
于 2013-10-23T15:21:48.767 に答える
1

したがって、ロジックは次のとおりです。フィールドのないアイテムがある場合は、例外をスローします。

var a = collection.Where(x => x.Field == null);
if(a.Any())
{
  throw new ScriptException("{0}", a.First().y);
}

さらに良い方法は、それらを照合することです。

var a = collection.Where(x => x.Field == null).Select(x => x.y);
if(a.Any())
{
  throw new ScriptException("{0}", string.Join(',', a));
}

そうすれば、すべてのインスタンスを表示できます。

于 2013-10-23T15:29:08.107 に答える
0

これはうまくいきますか?醜いですが、ラムダ内で例外をスローできます。

collection.FirstOrDefault(x => { 
                                 if(x.Field == null)
                                 {
                                       throw new ScriptException("{0}", x.y);
                                 }
                                 return false;
                                }
                          );
于 2013-10-23T15:37:42.233 に答える
0

結果はまだちょっと混乱していますが、 a を使用して.Selectへの外部参照を削除できます。a

collection.Where(x => x.Field == null)
    .Select(a => string.Format("{0}", a.y))
    .Take(1).ToList().ForEach(msg => 
        throw new ScriptException(msg);
    );

Take(1)一致するアイテムがない場合は空の列挙型を返すため、ブロックはForEach0 回または 1 回実行されます。

于 2013-10-23T15:23:18.473 に答える