假设我有以下元组列表:
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
创建新列表。但是必须有更好更快的方法吗?
答案 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