代码之家  ›  专栏  ›  技术社区  ›  Elisabeth

C:该代码是什么技术?

  •  0
  • Elisabeth  · 技术社区  · 15 年前

    我想知道:

    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 回复  |  直到 15 年前
        1
  •  7
  •   Lee    15 年前

    我想说一个更易读的版本是:

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

    OfType 过滤给定类型(运行)上的输入序列并 FirstOrDefault 找到第一个 Run 实例的 Text 属性以给定的输入结尾(如果未找到,则为空)。

        2
  •  3
  •   Philipp    15 年前

    是林肯。你知道“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,它的可读性就更差了!

        3
  •  1
  •   Community Mohan Dere    9 年前

    此代码似乎与 RichTextBox .NET框架中的类。

    这个 CaretPosition.Paragraph.Inlines 是构成段落正文的“inlines”集合。

    代码基本上是在寻找 Inlines 是那种类型的 Run ,并设置 matchedRun 如果有的话。这个 FirstOrDefault 方法只是查看对象集合内部并检索第一个元素或默认值(如果集合为空)的简单方法。

    就可读性而言,如果您熟悉LINQ语法,那么浏览该代码并不算太糟糕,尽管我个人确实发现了 Lee 为了更易于阅读,主要是因为使用了另一个LINQ表达式: OfType

        4
  •  0
  •   TalentTuner    15 年前

    它被称为“强大的LINQ技术”:)

    分开开玩笑

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

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

    =>被称为lambda技术,用于速记Delagate标志

    所以你可以把它读为

    从para.inlines集合中查找第一个对象,该对象以某个用户支持的值结尾,如果找不到匹配项,则返回默认值。

    如果你不想使用这种技术,它实际上减少了大量的代码,所以你可以尝试在同等的代码下使用。

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

    现在你可以决定哪个写得更好