2010-11-27 8 views
0

Je voudrais savoir:C#: Quelle est la technique de ce code?

  1. Qu'est-Technic est que le code?

  2. Pouvez-vous réécrire ce code pour le rendre plus lisible, parce que je fais pas complètement comprendre sa signification.

    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

Publier comme commentaire car je peux seulement répondre (1) c'est LINQ. Que comprenez-vous du code? – BoltClock

+0

il ne comprend pas complètement sa signification. –

+0

Il serait utile de savoir ce que vous ne comprenez pas à ce sujet. –

Répondre

7

Je dirais une version plus lisible serait:

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

OfType filtre la séquence d'entrée sur le type donné (Run) et FirstOrDefault trouve la première instance Run dont la propriété Text se termine par l'entrée donnée (ou null si aucune n'a été trouvée).

+0

C'est propre, je n'avais pas rencontré 'OfType' avant. – andynormancx

+0

J'aime ça :) 123 ... – Elisabeth

0

il est appelé "THE MIGHTY LINQ TECHNIQUE" :)

Blagues à part

il est méthode LINQ pour obtenir le premier élément de la collection ou retourner la valeur par défaut.

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

=> est appelée la techique Lambda pour decalaration sténographie delagate

afin que vous puissiez le lire comme

Trouver 1er objet de la collection para.Inlines où cet objet EndsWith une valeur suplied utilisateur ou retruner la valeur par défaut si aucune correspondance trouvée

si vous ne voulez pas utiliser cette technique qui réduit réellement beaucoup de code de sorte que vous pouvez essayer en dessous du code équivaut

 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; } 
     } 

Maintenant vous pouvez décider ce qui est mieux d'écrire

3

C'est Linq. Connaissez-vous le mot-clé "var"? C'est un type que le compilateur connaît mais le programmeur ne veut pas écrire.

Le code réécrite sans utiliser LINQ est

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) 
{ 


} 

Notez que je me suis converti "en ligne" à "INL". Ce n'est pas un mot-clé en C# mais Stackoverflow le fait ressembler à un.

Notez également qu'il est encore moins lisible une fois que vous vous êtes habitué à Linq!

+0

Vous ne pouvez pas affecter null à var, car le compilateur ne reconnaîtra pas le type. – mlusiak

+0

vous avez raison, merci pour l'indice. Corrigé le code. – Philipp

+0

vous a donné pas la solution, mais un point pour la réécriture :) – Elisabeth

1

Ce code semble être lié à la classe RichTextBox dans le .NET Framework. Le CaretPosition.Paragraph.Inlines est une collection de "Inlines" qui composent le corps du paragraphe.

Le code recherche fondamentalement tout Inlines qui sont de type Run, et de définir la valeur de matchedRun à cette première instance s'il y en a.La méthode FirstOrDefault est simplement un moyen pratique de regarder à l'intérieur d'une collection d'objets et de récupérer le premier élément ou une valeur par défaut si la collection est vide. En ce qui concerne la lisibilité, si vous êtes familier avec la syntaxe LINQ, ce n'est pas trop mal de parcourir ce code, bien que je trouve personnellement l'exemple de code fourni par Lee pour être un peu plus lisible - principalement à cause de l'utilisation d'une autre expression LINQ: OfType

+0

Une explication claire et excellente. – andynormancx