如何在C#中获取二维数组的列?

如何在C#中获取二维数组的列?,c#,arrays,C#,Arrays,如何做到这一点 当然,我可以创建一个新的列表,通过循环中的所有行手动填充它,并将其转换为数组,但没有更简洁的方法吗?是你的朋友 这就是我们C#开发者与凡人之间的区别 var array = new[] {new[]{'a', 'b', 'c'}, new[]{'d', 'e', 'f'}, new[]{'g', 'h', 'i'}}; var column = // should be like new[]{'b', 'e', 'h'} given index 1 您可以为此编写扩展方法:

如何做到这一点

当然,我可以创建一个新的列表,通过循环中的所有行手动填充它,并将其转换为数组,但没有更简洁的方法吗?

是你的朋友

这就是我们C#开发者与凡人之间的区别

var array = new[] {new[]{'a', 'b', 'c'}, new[]{'d', 'e', 'f'}, new[]{'g', 'h', 'i'}};

var column = // should be like new[]{'b', 'e', 'h'} given index 1

您可以为此编写扩展方法:

var array = new[] { new[] { "a", "b", "c" }, new[] { "d", "e", "f" }, new[] { "g", "h", "i" } };

var col1 = array.Select(x => x[1]);

//col1 contains "b", "e" and "h"

如果其中一个数组包含的元素少于列号,这也不会引发
indexoutfrange
异常。

array.Select(i=>i[1])?作为一个scala的家伙-事实上,你不能被原谅:-)你这里有一个数组数组,类型是
char[]][]
。如果你有一个真正的2D数组,类型是
char[,]
,那么解决方案就不同了
您可以执行类似于
Enumerable.Range(0,arr.GetLength(1)).Select(idx=>arr[col,idx])
其中
col
是基于零的列号。注意:对于真正的2D数组,两个索引用逗号分隔。或者我交换了行和列的角色,然后尝试
Enumerable.Range(0,arr.GetLength(0))。选择(idx=>arr[idx,col])相反。好的,是的,完全误解了它,很抱歉在线程的其他地方看到的解决方案
source.Select(x=>x[columnIndex])
更漂亮。它可以扩展到
source.Select(x=>x!=null&&x.Length>columnIndex?x[columnIndex]:default(T))
如果您真的坚持检查每个嵌套数组
x
@JeppeStigNielsen为什么要在不存在项的情况下返回默认值?如果您想改进
LINQ
解决方案,您可以做得更好:
source.Where(x=>x!=null&&x.Length>columnIndex)。选择(x=>x[columnIndex])顺便说一句,我提供此解决方案是因为已经提供了LINQ解决方案。我希望与您答案的代码具有相同的行为。它使返回列的“长度”等于外部数组的
length
source.length
,并且“行号”可靠。
public static T[] GetColumn<T>(this T[][] source, int columnIndex)
{
    int length = source.Length;

    var values = new T[length];
    for (int i = 0; i < length; i++)
    {
         if(source[i].Length > columnIndex)
            values[i] = source[i][columnIndex];
    }

    return values;
}
var column = array.GetColumn(1);