【发布时间】:2013-08-01 08:36:45
【问题描述】:
如果我有一个包含任意数量列表的列表,如下所示:
var myList = new List<List<string>>()
{
new List<string>() { "a", "b", "c", "d" },
new List<string>() { "1", "2", "3", "4" },
new List<string>() { "w", "x", "y", "z" },
// ...etc...
};
...有没有办法以某种方式将列表“压缩”或“旋转”成这样的东西?
{
{ "a", "1", "w", ... },
{ "b", "2", "x", ... },
{ "c", "3", "y", ... },
{ "d", "4", "z", ... }
}
显而易见的解决方案是这样做:
public static IEnumerable<IEnumerable<T>> Rotate<T>(this IEnumerable<IEnumerable<T>> list)
{
for (int i = 0; i < list.Min(x => x.Count()); i++)
{
yield return list.Select(x => x.ElementAt(i));
}
}
// snip
var newList = myList.Rotate();
...但我想知道是否有更清洁的方法,使用 linq 或其他方式?
【问题讨论】:
-
为什么要专门用LINQ来解决?
-
@Moo-Juice -- 很好,我编辑了我的标题。我想我只是自动假设解决方案会以某种方式使用 linq,但我想不一定是这种情况。
-
如果序列不是随机访问,您的示例代码效率非常低。
-
我对另一个使用 LINQ here 的问题更受限制,并且是对您的问题的更直接的回答。