我想知道:
该代码是什么技术?
你可以重写那段代码,使其更具可读性,因为我做到了 不完全理解它的含义。
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 :(得分: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; }
}
现在您可以决定哪个更好写