读一读“& &;根据从特定起始位置到特定结束位置的匹配值创建列表

本文关键字:位置 结束 列表 创建 | 更新日期: 2023-09-27 18:07:07

我已经创建了一个如下的文本文件

AB12345 werwer ssd fghfh
BA12345 wewewe wer sdfsf
CD44444 werwe werwe dgdg
DC44444 dsgdgfd dfgg fdgdfg

我要读取&根据位置从2到6的匹配值创建列表,即12345,它存在于两行中。因此它将在

下面创建list a
**List 1**                   **List 2**
AB12345 werwer ssd fghfh     CD44444 werwe werwe dgdg
BA12345 wewewe wer sdfsf     DC44444 dsgdgfd dfgg fdgdfg

请让我知道如何使用linq实现这个

读一读“& &;根据从特定起始位置到特定结束位置的匹配值创建列表

按子字符串从2到6分组行:

var lists = from l in File.ReadLines("fileName")
            group l by l.Substring(2,4) into g
            select g.ToList();

λ的语法:

var lists = File.ReadLines("fileName")
                .GroupBy(l => l.Substring(2,4))
                .Select(g => g.ToList());
输出:

[
  [ "AB12345 werwer ssd fghfh", "BA12345 wewewe wer sdfsf" ],
  [ "CD44444 werwe werwe dgdg", "DC44444 dsgdgfd dfgg fdgdfg" ]
]

注意您可以直接选择group,而不需要将其转换为list。在这种情况下,您还将获得有关每个组的分组密钥的信息,即。你的号码是1234和4444。例如

var groups = File.ReadLines("fileName").GroupBy(l => l.Substring(2,4));

或者你甚至可以使用lookup:

var lookup = File.ReadLines("fileName").ToLookup(l => l.Substring(2,4));

这将允许您通过关键字轻松访问行列表:

IEnumerable<string> list1 = lookup["1234"];
IEnumerable<string> list2 = lookup["4444"];

使用Select进行投影,通过string.SubString(即12345或44444)检索所需的行部分,然后在该值上应用GroupBy以分割输入列表。

基本上是这样的(没有实际测试):

var results = inputList
    .Select(z => new
    {
        Match = z.Substring(2, 5),
        Value = z
    })
    .GroupBy(z => z.Match);