使用C#lambdas组合列表<;int>;和int

使用C#lambdas组合列表<;int>;和int,c#,lambda,C#,Lambda,我有以下成对对象列表: var listOfPairs = new List<Pair<int, List<int>>>() { new Pair<int, List<int>>(30, new List<int>() {3, 6, 9}), new Pair<int, List<int>>(40, new List<int>() {4, 8, 12}) }; 我试过很多

我有以下成对对象列表:

var listOfPairs = new List<Pair<int, List<int>>>() {
    new Pair<int, List<int>>(30, new List<int>() {3, 6, 9}),
    new Pair<int, List<int>>(40, new List<int>() {4, 8, 12})
};
我试过很多像这样的摆弄,但都没有用:

var flattenedListOfPairs = listOfPairs.Select(pair => new List<int>(pair.First).AddRange(pair.Second));
var flattedListofPairs=listOfPairs.Select(pair=>newlist(pair.First).AddRange(pair.Second));

我假设我正在尝试做的事情是可能的,我只是错过了一些东西。

听起来你可能想要这样的东西:

var flattened = listOfPairs.Select(pair => new[] { pair.First }.Concat(pair.Second)
                                                               .ToList())
                           .ToList();
或:

或使用


听起来你可能想要这样的东西:

var flattened = listOfPairs.Select(pair => new[] { pair.First }.Concat(pair.Second)
                                                               .ToList())
                           .ToList();
或:

或使用


这将以您指定的形式提供列表列表:

listOfPairs.Select(p => new []{ p.First }.Concat(p.Second).ToList()).ToList()

这将以您指定的形式提供列表列表:

listOfPairs.Select(p => new []{ p.First }.Concat(p.Second).ToList()).ToList()

其他答案已经包括了如何做到这一点,所以我在这里不再重复。这个答案是为了解释为什么您现有的代码不起作用。您希望向列表构造函数传递一个int,并让它用该int初始化列表。构造函数不是这样工作的。列表构造函数使用int参数来设置列表的初始大小,而不是设置任何项的值。

其他答案已经介绍了如何实现这一点,因此在此不再重复。这个答案是为了解释为什么您现有的代码不起作用。您希望向列表构造函数传递一个int,并让它用该int初始化列表。构造函数不是这样工作的。列表构造函数使用int参数设置列表的初始大小,而不是设置任何项的值。

尝试以下操作:

var flattenedListOfPairs = listOfPairs.Select(pair => 
                                                  {
                                                      var list = new List<int>(pair.First);
                                                      list.AddRange(pair.Second));
                                                      return list;
                                                  }.ToList();
var flattedListofPairs=listOfPairs.Select(对=>
{
var列表=新列表(第一对);
list.AddRange(pair.Second));
退货清单;
}.ToList();
试试这个:

var flattenedListOfPairs = listOfPairs.Select(pair => 
                                                  {
                                                      var list = new List<int>(pair.First);
                                                      list.AddRange(pair.Second));
                                                      return list;
                                                  }.ToList();
var flattedListofPairs=listOfPairs.Select(对=>
{
var列表=新列表(第一对);
list.AddRange(pair.Second));
退货清单;
}.ToList();

听起来像是
SelectMany()
的工作?听起来像是
SelectMany()
的工作?Jon,我爱你的MoreLINQ库,这是你所不知道的。我很惊讶这些方法中有很多没有被添加到框架中,尽管我知道有一些没有被添加的机会。在我看来,Concat是最好的选择,因为如果“first”这个数字已经存在于收藏中的话,Union会删除它。waldrumpus首先得到了他发布的答案b/c,但我投票支持你的评论,因为你详细阐述了解决我问题的多种方法,并向我介绍了MoreLINQ。太好了!乔恩,我比你所知道的更爱你的莫林克图书馆。我很惊讶这些方法中有很多没有被添加到框架中,尽管我知道有一些没有被添加的机会。在我看来,Concat是最好的选择,因为如果“first”这个数字已经存在于收藏中的话,Union会删除它。waldrumpus首先得到了他发布的答案b/c,但我投票支持你的评论,因为你详细阐述了解决我问题的多种方法,并向我介绍了MoreLINQ。太好了@AspNyc请注意,如果您放弃第一次调用
ToList
,结果列表的元素将是
IEnumerable
,而不是列表。是的,我也意识到了这一点=P谢谢@AspNyc请注意,如果您放弃第一次调用
ToList
,结果列表的元素将是
IEnumerable
,而不是列表。是的,我也意识到了这一点=P谢谢!是的,我对C#还是个新手,当我真正打算使用对象初始化语法(例如{..})时,我会尝试将数据传递给构造函数。谢谢你指出这一点!是的,我对C#还是个新手,当我真正打算使用对象初始化语法(例如{..})时,我会尝试将数据传递给构造函数。谢谢你指出这一点!