Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带正则表达式的Linq_C#_Linq - Fatal编程技术网

C# 带正则表达式的Linq

C# 带正则表达式的Linq,c#,linq,C#,Linq,我有一个正则表达式模式的匹配项,我在围绕它设计Linq以产生所需的输出时遇到了一些困难 数据长度固定:1231234512341234567 本例中的长度为:3,5,4,7 使用的正则表达式模式是:(.{3})(.{5})(.{4})(.{7}) 这一切都工作得非常好,模式的匹配结果如预期的那样,但是,预期的输出被证明有点困难。事实上,我甚至不确定它在SQL术语中会被称为什么——除了pivot查询。所需的输出是从给定位置的每个组中获取所有值,并将它们连接起来,例如: field1:value1;

我有一个正则表达式模式的匹配项,我在围绕它设计Linq以产生所需的输出时遇到了一些困难

数据长度固定:
1231234512341234567

本例中的长度为:
3,5,4,7

使用的正则表达式模式是:
(.{3})(.{5})(.{4})(.{7})

这一切都工作得非常好,模式的匹配结果如预期的那样,但是,预期的输出被证明有点困难。事实上,我甚至不确定它在SQL术语中会被称为什么——除了pivot查询。所需的输出是从给定位置的每个组中获取所有值,并将它们连接起来,例如:

field1:value1;value2;value3;valueN;field2:value2;value3;valueN;
使用下面的Linq表达式,我可以得到field1-value1、field2-value2等

var matches = Regex.Matches(data, re).Cast<Match>();

var xmlResults = from m in matches
                 from e in elements
                 select string.Format("<{0}>{1}</{0}>", e.Name, m.Groups[e.Ordinal].Value);
var matches=Regex.matches(data,re.Cast();
var xmlResults=来自匹配中的m
从元素中的e
选择string.Format(“{1}”,e.Name,m.Groups[e.Ordinal].Value);
但我似乎不知道如何使用元素的序号从“组”中获取位置1处的所有值,然后是位置2处的所有值,依此类推

本例中的“元素”是字段名和序号位置(从1开始)的集合。所以,它看起来是这样的:

public class Element
{
    public string Name { get; set; }
    public int Ordinal { get; set; }
}

var elements = new List<Element>{ 
    new Element { Name="Field1", Ordinal=1 },
    new Element { Name="Field2", Ordinal=2 }
};
// Use ToList to avoid iterating matches multiple times
var matches = Regex.Matches(data, re).Cast<Match>().ToList();
// For each element, join all matches, and pull in the value for e.Ordinal
var xmlResults = elements.Select(e => 
    string.Format(
        "<{0}>{1}</{0}>"
    ,   e.Name
    ,   string.Join(";", matches.Select(m => m.Groups[e.Ordinal].Value))
    );
公共类元素
{
公共字符串名称{get;set;}
公共整数序号{get;set;}
}
var elements=新列表{
新元素{Name=“Field1”,序号=1},
新元素{Name=“Field2”,序号=2}
};
我已经回顾了很多不同的Linq表达式,并深入研究了一些pivot类型的Linq表达式,但没有一个能让我接近——它们都使用了join运算符,我认为这是不可能的


有人知道如何使这个Linq吗?

您应该能够通过将查询更改为仅从
元素中选择,并通过
字符串引入
匹配项来实现这一点。加入
,如下所示:

public class Element
{
    public string Name { get; set; }
    public int Ordinal { get; set; }
}

var elements = new List<Element>{ 
    new Element { Name="Field1", Ordinal=1 },
    new Element { Name="Field2", Ordinal=2 }
};
// Use ToList to avoid iterating matches multiple times
var matches = Regex.Matches(data, re).Cast<Match>().ToList();
// For each element, join all matches, and pull in the value for e.Ordinal
var xmlResults = elements.Select(e => 
    string.Format(
        "<{0}>{1}</{0}>"
    ,   e.Name
    ,   string.Join(";", matches.Select(m => m.Groups[e.Ordinal].Value))
    );
//使用ToList避免多次迭代匹配
var matches=Regex.matches(data,re.Cast().ToList();
//对于每个元素,连接所有匹配项,并拉入e.Ordinal的值
var xmlResults=elements.Select(e=>
字符串格式(
"{1}"
,e.姓名
,string.Join(“;”,matches.Select(m=>m.Groups[e.Ordinal].Value))
);

注意:这不是格式化XML的最佳方式。您最好使用.NET的一个库来生成XML,例如LINQ2XML。

谢谢,我会尝试一下。它很接近-第一个SelectMany似乎在正确的轨道上,但是如何一次性输出元素名,后面有许多值?还要注意,我没有输出XML-这是一种专有格式。@ChrisGessler如果您不想将它们放在单独的标记中,您甚至不需要
SelectMany
-您可以在一个使用
string.format
string.join
的简单
Select
中立即加入它们(请参阅更新)。