2010-11-27 19 views
0

私が知りたいのですが:C#:そのコードはどのような技術ですか?

  1. そのコードは何テクニック?

  2. はその意味を完全に理解していないため、コードを読みやすくするために書き換えることができます。それは "MIGHTY LINQ技術" :)

    ジョークと呼ばれています

    Paragraph para = CaretPosition.Paragraph; 
    
    
    var matchedRun = para.Inlines.FirstOrDefault(inline => 
    { 
        Run run = inline as Run; 
        return (run != null && run.Text.EndsWith(inputText)); 
    }) as Run; 
    
    
    if (matchedRun != null) 
    { 
    
    
    } 
    
+0

私は(1)それはLINQに答えることができるので、コメントとして投稿してください。コードについて何を理解していますか? – BoltClock

+0

彼はその意味を完全に理解していません。 –

+0

あなたがそれについて理解していないことを知るのに役立ちます。 –

答えて

7

を書くために優れているかを決定することができます

var matchedRun = para.Inlines 
    .OfType<Run>() 
    .FirstOrDefault(r => r.Text.EndsWith(intputText)); 

OfType指定された型(ラン)とFirstOrDefault上の入力シーケンスをフィルタリングTextプロパティが指定された入力で終了する最初のRunインスタンスを検索します。見つからない場合はnullを返します。

+0

これはきちんとしています。 – andynormancx

+0

私はそれが好きです:) 123 ... – Elisabeth

0

は離れて

コレクションから最初の要素を取得したり、デフォルト値を返すようにLINQの方法です。

var matchedRun = para.Inlines.FirstOrDefault(inline =>{ Run run = inline as Run; return (run != null && run.Text.EndsWith(inputText));}) as Run; 

=>は、速記のdelagateのdecalaration

のためのラムダtechiqueと呼ばれているので、あなたは

としてそれを読むことができ、そのオブジェクトがEndsWith para.Inlinesコレクションから第一のオブジェクトにいくつかのユーザーsuplied値を探しますか、一致するものが見つからない場合は再実行のデフォルト値

このテクニックを使用したくない場合は、実際にコードが大きくなるので、同等のコードで試すことができます

 Paragraph para = CaretPosition.Paragraph; 
     var matchedRun = null; 
     foreach (var inl in para.Inlines) 
     { Run run = inl as Run; 
      if ((run != null) && run.Text.EndsWith(inputText)) 
      { matchedRun = run; break; } 
     } 

今、あなたは私が読みやすくバージョンは次のようになり言うと思います

3

これはLinqです。あなたは "var"キーワードを知っていますか?これは、コンパイラが知っているがプログラマが書いたくない型です。

のLINQを使用せずに再記述されたコードは、私が「INL」と「インライン」に変換

Paragraph para = CaretPosition.Paragraph; 

Run matchedRun = null; 
foreach (var inl in para.Inlines) 
{ 
    Run run = inl as Run; 
    if((run != null) && run.Text.EndsWith(inputText)) 
    { 
    matchedRun = run; 
    break; 
    } 
} 

if (matchedRun != null) 
{ 


} 

注あります。 C#ではキーワードではありませんが、Stackoverflowはそのように見えます。

また、Linqに慣れればさらに読みにくいことに注意してください。

+0

コンパイラは型を認識しないので、varにnullを代入することはできません。 – mlusiak

+0

あなたは正しいです、ヒントのおかげで。コードを修正しました。 – Philipp

+0

は解決策ではなく、書き直しのポイントを与えました:) – Elisabeth

1

このコードは、.NET FrameworkのRichTextBoxクラスに関連しているようです。

CaretPosition.Paragraph.Inlinesは、段落の本文を構成する「インライン」の集まりです。

コードは基本的にRunタイプのInlinesを探していて、値がmatchedRunの場合はその最初のインスタンスに設定します。FirstOrDefaultメソッドは、オブジェクトのコレクションを調べて最初の要素を取得するか、コレクションが空の場合はデフォルト値を取得するのに便利な方法です。

LINQの構文に精通していれば、Leeで提供されているサンプルコードを個人的に見つけることはできますが別のLINQ式の使用:OfType

+0

明確で優れた説明。 – andynormancx

関連する問題