c#将元组列表拆分为多个列表

时间:2018-02-28 12:25:28

标签: c#

假设我有以下元组列表:

List<Tuple<string, string>>

{"Name", "xx"},{"Age", "25"},{"PostalCode", "12345"},{"Name", "yy"},{"Age", "30"},{"PostalCode", "67890"}

我想将此列表拆分为多个列表。拆分标准为Item1 == "Name"

结果应如下:

清单1:

  

{“姓名”,“xx”},{“年龄”,“25”},{“PostalCode”,“12345”}

清单2:

  

{“姓名”,“yy”},{“年龄”,“30”},{“PostalCode”,“67890”}

我有一个解决方案,我记下原始列表中“Name”的索引,并使用函数GetRange创建新列表。但是必须有更好更快的方法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用LINQ查找Name的所有索引,并将其和以下3个条目选择到新列表中。

这假设原始列表格式正确,因此对于每个Name,保证其后面有两个有效字段。

var data = new List<Tuple<string, string>>
{
    new Tuple<string, string>("Name", "xx"),
    new Tuple<string, string>("Age", "25"),
    new Tuple<string, string>("PostalCode", "12345"),
    new Tuple<string, string>("ignoreMe", "345"),
    new Tuple<string, string>("Name", "yy"),
    new Tuple<string, string>("Age", "30"),
    new Tuple<string, string>("PostalCode", "67890")
};

var lists = data
    .Select((x, i) => new { Index = i, Value = x })
    .Where(x => x.Value.Item1 == "Name")
    .Select(x => data.Skip(x.Index).Take(3))
    .ToList();

此外,可能还有比这更好的解决方案。

答案 1 :(得分:1)

您可以使用Enumrable.Range循环播放列表并选择所需的元组:

List<Tuple<string, string>> data = new List<Tuple<string, string>>
{
    new Tuple<string, string>("Name", "xx"),
    new Tuple<string, string>("Age", "25"),
    new Tuple<string, string>("PostalCode", "12345"),
    new Tuple<string, string>("Name", "yy"),
    new Tuple<string, string>("Age", "30"),
    new Tuple<string, string>("PostalCode", "67890")
};

var result = Enumerable.Range(0, data.Count).Where(i => data[i].Item1 == "Name")
            .Select(i => data.Skip(i).Take(3).ToList())
            .ToList();

您可以在此处测试我的代码:https://dotnetfiddle.net/6fJumx