2017-03-01 5 views
1

私はいくつかの異なる組み合わせを試してみましたが、これは、私は比較として仕事を得ることができる唯一の組み合わせだった=「」ヌルのために問題を与えるように見えた!C#でヌルチェックの必要性を取り除く方法はありますか?

 if (options.English != null && options.English != "") 
     { 
      if (options.English.StartsWith("^")) 
      { 
       query = query.Where(w => w.English.StartsWith(options.English.Trim().Substring(1))); 
      } 
      else 
      { 
       query = query.Where(w => w.English.Contains(options.English.Trim())); 
      } 
     } 

が、私はこれを最適化する可能性がどのような方法があります1つのif文、または2つのif文であっても、外側と内側のif文ではなく、互いに続く2つのif文に簡単にすることができます。

+1

あなたは、C#6.0を使用していますか?あなたはヌル伝播を調べたいかもしれません、あなたはその全体のチェックを一括して取り除くことができます。 – maxshuty

+2

['String.IsNullOrWhitepace()'](https://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace(v = vs.110).aspx)? –

+2

string.IsNullOrEmpty()を試しましたか? –

答えて

0

場合は、ネストされたif Sを削除されてやろうとしているすべてのは、その後、あなたは確かにこれを取得することができます?:と一緒String.IsNullOrEmpty()を使用することによって、今Dictionary

var lookup = new Dictionary<bool, Func<Options, bool>>() { 
    { true, w => w.English.StartsWith(options.English.Trim().Substring(1)) }, 
    { false, w => w.English.Contains(options.English.Trim())} }; 

if (options.English != null && options.English != "") 
{ 
    query = query.Where(lookup[options.English.StartsWith("^")]); 
} 

にラムダを保存することができます... 1つの文にダウンし、それも恐ろしいではありません。

query = String.IsNullOrEmpty(options.English) ? 
    query : query.Where(lookup[options.English.StartsWith("^")]); 

しかし、あなたは2つだけのオプションを持っていることを考えると、DictionaryはレアではありませんLLY必要に応じ、わずか数地元の人々を使用します。

Func<Options, bool> startsWithCaret = w => w.English.StartsWith(options.English.Trim().Substring(1)); 
Func<Options, bool> doesNotStartWithCaret = w => w.English.Contains(options.English.Trim()); 
var lambda = options.English.StartsWith("^") ? startsWithCaret : doesNotStartWithCaret; 

あなたしている文は、今発見される

query = String.IsNullOrEmpty(options.English) ? query : query.Where(lambda); 

ないifです!:-)

+0

ルックアップの仕組みがわからない。私はEntity FrameworkとSQL Serverを使用しています。これがEFで動作すると思いますか? –

4

あなたはstring.IsNullOrEmpty()を探しています。ネストを削除するには

、あなたは(C#6)を行うことができます

if (options.English?.StartsWith("^") == true) { 
    ... 
} else if (!string.IsNullOrEmpty(options.English) { 
    ... 
} 
+2

これはネストされた 'if'文を質問は – Servy

+0

を尋ねています。ありがとう、私はその小切手を知らなかったし、それは少なくとも私がやろうとしていることを少し明確にするだろう。 –

+0

@Servy:編集を参照してください。 – SLaks

3

これは、入れ子にすることなく、より長い鎖の中にいない他で外ifを変換するために些細です。

if (A) { 
    if (B) { ... } 
} 

は、あなたの場合は

if (!A) 
{ /* do nothing */ } 
else if (B) { ... } 

となり、それは言語の規則に従って、if (B) ... elseが実際に他の最初の内側にネストされていますが、人間のプログラマが「ドン

if (string.IsNullOrEmpty(options.English)) 
    { /* do nothing */ } 
else if (options.English.StartsWith("^")) 
    { 
     query = query.Where(w => w.English.StartsWith(options.English.Trim().Substring(1))); 
    } 
else 
    { 
     query = query.Where(w => w.English.Contains(options.English.Trim())); 
    } 

注意ですそれをネスティングとして表現するか、チェーンというよりはむしろネスティングと考えることができます。あなたは、独自のメソッドに出てコードをリファクタリングした場合

+0

あなたが言ったように、あなたはまだ 'if'ステートメントをネストしていますが、ネストされた' if'ステートメントに加えて混乱している空のブロックがあります。 – Servy

+0

@Servy:それはOPが要求したものです(お互いに続くif文が2つあります)。彼は、チェーンがまだコンパイラの観点から入れ子になっていることを単に気づかなかった。彼がそれについて異なって考えるならば、それはそれを回す十分な理由です。 –

+0

しかし、あなたの 'if'ステートメント*は、他のステートメントに従わない*。それはその中に入れ子になっています。 – Servy

-2

そして、あなたはそれらを入れ子にすることなく、別のif文を持っているreturn文を活用することができます:あなたは、あなたが示されてきた方法にquery = AddOptions(query, options)を書き込むことができ

public static IEnumerable<Item> AddOption(IEnumerable<Item> query, Option options) 
{ 
    if (string.IsNullOrEmpty(options.English)) 
     return query; 
    if (options.English.StartsWith("^")) 
     return query.Where(w => w.English.StartsWith(options.English.Trim().Substring(1))); 
    return query = query.Where(w => w.English.Contains(options.English.Trim())); 
} 

+3

誰かのコメントを回答にするときは、クレジットを与えるのが適切です。 –

+0

@BenVoigt私は誰かのコメントを答えにしませんでした。あなたは私の答えを書いている間、同様の提案をしてコメントを書いた。 – Servy

0

最もパフォーマンスが、nullが

if (!options.English.IsNullOrEmpty()) 
    query = query.Where(w => 
     w.English.Contains(string.Concat("^", options.English) 
     .Replace("^^","^").Substring(1).Trim())); 

ちょうど常にあなたの文字列の前に^を入れられるだけのための場合とそう最短の方法ではありません、(多分)に取って代わると^^を作成^と入力して、いつでもサブストリング(1)を実行できます。

0

あなたのロジックは、このように単純化することができます。

 if (!string.IsNullOrEmpty(options.English)) 
     { 
      var s = options.English.Trim(); 
      query = query.Where(w => { return s.StartsWith("^") ? 
       w.English.StartsWith(s.Substring(1)) : w.English.Contains(s); }); 
     } 
関連する問題