Во-первых, избавьтесь от DataTable для этих подсчетов данных. Использование памяти здесь очень велико.
Если ваши данные всегда равны 0/1, наиболее эффективным способом должна быть битовая маска.
Если ваши данные не только 0/1, создайте структуру, которая абстрагирует все ваши столбцы.
Вот концептуальный прототип этой структуры данных.
class MyData {
public MyData(int[] columns, object[] data) {
_columns = columns;
_data = data;
}
int[] _columns;
object[] _data;
public object this[int column] {
get {
int index = IndexOf(column);
return index != -1 ? _data[index] : null;
}
}
private int IndexOf(int column) {
for (int i = 0; i < _columns.Length; i++)
if (_columns[i] == column)
return i;
return -1;
}
}
Вы можете дополнительно сохранить память для _columns, применив шаблон flyweight.
Надеюсь, это поможет