我的问题类似于Link
List<List<T>> listOfList;
// add three lists of List<T> to listOfList, for example
/* listOfList = new {
{ "Name 1", 1, 2},
{ "Name 1", 3, 4},
{ "Name 2", 1, 2}
};
*/
我想知道如何合并具有相同名称的项目
List<T> list = { { "Name 1", 1, 2, 3, 4 }, { "Name 2", 1, 2 } };
我尝试了Concat的方法,但我不知道怎么做条件。
谢谢。
答案 0 :(得分:3)
假设:
List<List<string>> listOfList = new List<List<string>>(){
new List<string>() { "Name 1", "1", "2"},
new List<string>() { "Name 1", "3", "4"},
new List<string>() { "Name 2", "1", "2"}
};
代码:
var result = listOfList.GroupBy(l => l.First(),
(key, values) => values)
.Select(l => l.Aggregate((acc, next) =>
acc.Concat(next.Skip(1))
.ToList()))
.ToList();
结果:
解释:关于GroupBy
元素的LINQ List
运算符组First
。对于每个组,仅选择values
(键不相关,因为它是其中一个值)。然后,对于每个组,我们Aggregate
列出所有列表Concat
,但省略(Skip(1)
)第一个包含名称的元素。
答案 1 :(得分:1)
Konrad Kokosa解决方案的变体(SelectMany
而不是Aggregate
):
List<List<string>> listOfList = new List<List<string>>()
{
new List<string>() { "Name 1", "1", "2"},
new List<string>() { "Name 1", "3", "4"},
new List<string>() { "Name 2", "1", "2"}
};
var result = listOfList
.GroupBy(grp => grp.First())
.Select(grp => new List<string>{ grp.Key }.AsEnumerable().Concat(grp.SelectMany(g => g.Skip(1))).ToList())
.ToList();