0

给定字符串“a:b,c”,我想在 C# 中使用正则表达式和 lambda 表达式将字符串拆分为类列表,以便返回以下内容。

{
    Column1: "a",
    Column2: "b",
},
{
    Column1: "a",
    Column2: "c",
}

换句话说,我想为冒号后面的每个逗号分隔值重复冒号之前的值。在 SQL 中,这相当于进行交叉连接,其中 Column1 是连接的左侧,而 Column2 是连接的右侧。

我有大部分代码,包括正则表达式,但我无法将逗号分隔值的第二个select投影split到新类中。相反,我的代码有效地返回以下内容。

{
    Column1: "a",
    Column2: [
        "b",
        "c"
    ]
}

这是我的代码,就目前而言。

public class MyClass {
    public string Column1 { get; set; }
    public string Column2 { get; set; }
}

List<MyClass> mc = "a:b,c"
    .Select(a => new { Column1 = new Regex(@"[a-z]+(?=\:)").Match(a).Value), Column2s = new Regex(@"(?<=\:)[a-z]+(,[a-z]+)*").Match(a).Value })
    .Select(b => new MyClass { Column1 = b.Column1, Column2 = b.Column2s.Split(',') })
    .ToList();

感谢您的帮助。

4

2 回答 2

1
string input = "a:b,c";

int colon = input.IndexOf(':');
string left = input.Substring(0, colon);
string right = input.Substring(colon + 1);

List<MyClass> result = right.Split(',')
                            .Select(x => new MyClass
                            {
                                Column1 = left,
                                Column2 = x,
                            })
                            .ToList();
于 2013-04-18T08:27:14.883 回答
0

肯定存在其他解决您的问题的方法。你可以试试这个:

    [Test]
    public void ATest()
    {
        const string TestValue = "a:b,c";

        string valueForColumnA = new Regex(@"[a-z]+(?=\:)").Match(TestValue).Value;
        string setForColumnB = new Regex(@"(?<=\:)[a-z]+(,[a-z]+)*").Match(TestValue).Value;
        var target = setForColumnB.Split(',')
            .Select(item => new MyClass { Column1 = valueForColumnA, Column2 = item })
            .ToList();

        Assert.AreEqual(target[0].Column1, "a");
        Assert.AreEqual(target[0].Column2, "b");

        Assert.AreEqual(target[1].Column1, "a");
        Assert.AreEqual(target[1].Column2, "c");
    }

不使用正则表达式(就性能而言)可能是更好的解决方案,但是,如果您将其指定为要求,则此解决方案有效。

于 2013-04-18T09:17:06.433 回答