如何在C#中获取二维数组的列?
如何做到这一点 当然,我可以创建一个新的列表,通过循环中的所有行手动填充它,并将其转换为数组,但没有更简洁的方法吗?是你的朋友 这就是我们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 您可以为此编写扩展方法:
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);