Here this will remove every Column/Row with only zero
int[][] test = { new int[]{0, 0, 0, 0},
new int[]{0, 0, 1, 1},
new int[]{0, 1, 1, 0},
new int[]{0, 0, 0, 0} };
var result =
Transpose(Transpose(test.Where(row => !row.All(item => item == 0)).ToArray()).Where(row => !row.All(item => item == 0)).ToArray())
.ToArray();
This basically selects the rows where there isn't a single 0. Now transpose the matrix(its easier to not select rows than not selecting columns) and again select every row where there isn't any 0(meaning there is at least a 1 we need), now transpose back to original order.
here are the helper methods
static int[][] Transpose(int[][] originalArray)
{
int w = originalArray.Length;
int h = originalArray[0].Length;
int[][] result = CreateJaggedArray<int[][]>(h, w);
for (int i = 0; i < originalArray.Length; i++)
for (int j = 0; j < originalArray[i].Length; j++)
{
result[j][i] = originalArray[i][j];
}
return result;
}
static T CreateJaggedArray<T>(params int[] lengths)
{
return (T)InitializeJaggedArray(typeof(T).GetElementType(), 0, lengths);
}
static object InitializeJaggedArray(Type type, int index, int[] lengths)
{
Array array = Array.CreateInstance(type, lengths[index]);
Type elementType = type.GetElementType();
if (elementType != null)
{
for (int i = 0; i < lengths[index]; i++)
{
array.SetValue(
InitializeJaggedArray(elementType, index + 1, lengths), i);
}
}
return array;
}
you can convert them to extensions if you want since they are static anyway.
Check out the complete example at dotnetfiddle