C#:那个代码是什么技术?

时间:2010-11-27 14:30:43

标签: c# linq

我想知道:

  1. 该代码是什么技术?

  2. 你可以重写那段代码,使其更具可读性,因为我做到了 不完全理解它的含义。

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

4 个答案:

答案 0 :(得分:7)

我会说更可读的版本是:

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

OfType过滤给定类型的输入序列(Run),FirstOrDefault找到Run属性以给定输入结束的第一个Text实例(如果没有找到)。

答案 1 :(得分:3)

这是Linq。你知道“var”关键字吗?它是编译器知道的类型,但程序员不想写。

不使用Linq的重写代码是

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


}

请注意,我将“inline”转换为“inl”。它不是C#中的关键字,但Stackoverflow使它看起来像一个。

另请注意,一旦习惯了Linq,它甚至更难以阅读!

答案 2 :(得分:1)

此代码似乎与.NET Framework中的RichTextBox类相关。

CaretPosition.Paragraph.Inlines是构成段落主体的“Inlines”的集合。

代码基本上是在寻找Inlines类型的Run,并将matchedRun的值设置为该第一个实例(如果有)。 FirstOrDefault方法只是查看对象集合并检索第一个元素的简便方法,如果集合为空则检索默认值。

就可读性而言,如果您熟悉LINQ语法,那么通过该代码并不是太糟糕,尽管我个人觉得Lee提供的示例代码更具可读性 - 主要是因为使用了另一个LINQ表达式:OfType

答案 3 :(得分:0)

它被称为“THE MIGHTY LINQ TECHNIQUE”:)

分开笑话

从集合中获取First元素或返回默认值是Linq方法。

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

=&GT;被称为Lambda技术的速记delagate decalaration

所以你可以把它读作

从para.Inlines集合中查找第一个对象,其中该对象Ends具有某些用户上载值或者如果未找到匹配则返回默认值

如果您不想使用这种技术实际上减少了大量代码,那么您可以尝试使用下面的等价代码

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

现在您可以决定哪个更好写