2

给定字符串“a:b;c:d,e;f:g,h,i”,我想将字符串拆分为一个包含两列的平面列表,每一列用于键(在冒号的左侧) 和值(逗号分隔在冒号的右侧)。结果应该是这样的。

{
    Key: "a",
    Value: "b"
},
{
    Key: "c",
    Value: "d"
},
{
    Key: "c",
    Value: "e"
},
{
    Key: "f",
    Value: "g"
},
{
    Key: "f",
    Value: "h"
},
{
    Key: "f",
    Value: "i"
}

问题是我无法在所有键上展平第二次拆分逗号的结果,因此我返回一个 KeyValue 列表,而不是 KeyValue 列表的列表。

public class KeyValue {
    public string Key { get; set; }
    public string Value { get; set; }
}

List<KeyValue> mc = "a:b;c:d,e;f:g,h,i"
    .Split(';')
    .Select(a =>
    {
        int colon = a.IndexOf(':');
        string left = a.Substring(0, colon);
        string right = a.Substring(colon + 1);
        List<KeyValue> result = right.Split(',').Select(x => new KeyValue { Key = left, Value = x }).ToList();
        return result;
    })
    .ToList();

谢谢你的帮助。

4

5 回答 5

1
List<KeyValue> mc = "a:b;c:d,e;f:g,h,i"
    .Split(';')
    .Select(a =>
    {
        int colon = a.IndexOf(':');
        string left = a.Substring(0, colon);
        string right = a.Substring(colon + 1);
        return new KeyValue() { Key = left, Value = right };
    })
    .ToList();

编辑:

只是为了澄清Select项目列表到新类型; 它已经List为您处理了创建。因此,您要求 a ListofList对象。在这种情况下,您只需要询问对象KeyValue

于 2013-04-18T16:43:39.320 回答
1

非常亲近。展平序列序列的方法是SelectMany。我们可以在现有代码的末尾添加一个,但由于它已经以 a 结尾Select,我们实际上可以将其更改为 a SelectMany,我们就完成了:

List<KeyValue> mc = "a:b;c:d,e;f:g,h,i"
    .Split(';')
    .SelectMany(a =>
    {
        int colon = a.IndexOf(':');
        string left = a.Substring(0, colon);
        string right = a.Substring(colon + 1);
        List<KeyValue> result = right.Split(',')
            .Select(x => new KeyValue { Key = left, Value = x }).ToList();
        return result;
    })
    .ToList();
于 2013-04-18T17:01:22.600 回答
0

您无需返回新的List<KeyValue> result. 您只想返回KeyValue如下

string data = "a:b;c:d,e;f:g,h,i";

var mc = data
    .Split(';')
    .Select(a =>
    {
        int colon = a.IndexOf(':');
        string left = a.Substring(0, colon);
        string right = a.Substring(colon + 1);
        return new KeyValue() { Key = left, Value = right };
    }).ToList();
于 2013-04-18T16:46:23.240 回答
0

与往常一样,它可以通过 Linq 执行:

string s = "a:b;c:d,e;f:g,h,i";
string Last = "";
var Result = s.Split(';', ',').Select(x =>
{
    if (x.Contains(":"))
    {
        Last = x.Split(':')[0];
        return new { Key = x.Split(':')[0], Value = x.Split(':')[1] };
    }
    else return new { Key = Last, Value = x };
});
于 2013-04-18T16:53:20.130 回答
0
string data = "a:b;c:d,e;f:g,h,i";

var mc = data
    .Split(';')
    .SelectMany(x => {
        int separatorIndex = x.IndexOf(':');
        var key = x.Substring(0, separatorIndex);
        var values = x.Substring(separatorIndex + 1).Split(',');

        return values.Select(v => new KeyValuePair<string,string>(key, v));
    });

变换结果

于 2013-04-18T17:09:43.870 回答