将列表中的项目打包成一对列表

时间:2012-06-18 15:20:07

标签: c# linq list grouping

我有一个ProjectItem类实例列表:List<ProjectItem> allProjects

我需要获取List<ProjectItemPair> - 一个新的类实例列表,其中包含ProjectItem projectOneProjectItem projectTwo作为属性。

我必须预先处理初始列表,并且使用bool开关在迭代中的每个第二项上的结果列表中添加新的ProjectItemPair。这是一种原始的旧学校方法。我相信Linq我可以有效地配对项目实例。我该怎么做?

1 个答案:

答案 0 :(得分:2)

好吧,你可以使用:

var pairs = allProjects.Select((value, index) = > new { value, index })
                       .GroupBy(x => x.index / 2, x => x.value)
                       .Select(pair => new ProjectItemPair(pair.ElementAt(0),
                                                     pair.ElementAtOrDefault(1)))
                       .ToList();

使用ElementAtOrDefault表示如果元素数量奇数,构造函数将被传递null

另一种更简单的选择:

var pairs = Enumerable.Range(0, allProjects.Count / 2)
                      .Select(i => new ProjectItemPair(allProjects[i * 2],
                                                       allProjects[i * 2 + 1]))
                      .ToList();

如果输入有奇数个元素,这将省略最后一个元素,在这种情况下你可以这样做:

if ((allProjects.Count % 2) == 1)
{
    pairs.Add(new ProjectItemPair(allProjects.Last(), null);
}