前段时间在stackoverflow上找到了这段代码,但是好像又找不到了。全部归功于作者。对不起,我无法链接。
题?某些 C# LINQ 大师能否请逐步分解此语句,因为我很难理解它。它当然运行良好并且可以完成工作,但是如何呢?
分割线
var line = $"13351.750815 26646.150876 6208.767863 26646.150876 1219.200000 914.400000 0.000000 1 \"Beam 1\" 0 1 1 1 0 1 1e8f59dd-142d-4a4d-81ff-f60f93f674b3";
var splitLineResult = line.Trim().Split('"')
.Select((element, index) => index % 2 == 0
? element.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
: new string[] { element })
.SelectMany(element => element).ToList();
Run Code Online (Sandbox Code Playgroud)
LinqPad 中的语句结果

您需要从分析手头的输入开始。
13351.750815 26646.150876 6208.767863 26646.150876 1219.200000 914.400000 0.000000 1 "Beam 1" 0 1 1 1 0 1 1e8f59dd-142d-4a4d-81ff-f60f93f674b3
Run Code Online (Sandbox Code Playgroud)
输入由几个由Whitespace分隔的字母数字字符串组成。但是,还有一种特殊情况需要处理。“ Beam 1”一词包含在引号中。
现在,让我们分解 Linq 语句。
line.Trim().Split('"')
Run Code Online (Sandbox Code Playgroud)
第一个语句根据分隔符Quotes拆分输入。这将字符串分成 3 部分。
正如您可以观察到的第一个(在第 0 个索引中)和最后一个(在索引位置 2 中)需要进一步拆分,而索引位置 1 中的元素已经被解析。这就是 Linq 语句的第二部分出现的地方。
.Select((element, index) => index % 2 == 0
? element.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
: new string[] { element })
Run Code Online (Sandbox Code Playgroud)
在上面的语句中,Select((element, index) => index % 2 == 0部件检查当前索引位置是否处于偶数位置。如果是这样,则需要根据 delimiter 进一步拆分子字符串' ' (whitespace)。否则,它会创建一个包含单个实体“Beam 1”的数组
在第二部分的结尾,您得到的是字母数字字符串 ( IEnumerble<string[]>) 的3 个子集合。
现在需要做的是通过展平父集合来创建一个集合。这是使用Enumerable.SelectMany.
.SelectMany(element => element).ToList();
Run Code Online (Sandbox Code Playgroud)
希望有助于更好地理解 Linq 查询
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |