Поскольку подход Эрика заключается в использовании IEnumerable<IEnumerable<T>>
, вы должны делать что-то вроде этого:
Код Эрика:
static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] {item}));
}
Звоните на сайт:
var sequences = new int?[][] { MatrixArray_1, MatrixArray_2, ..., MatrixArray_6 };
var cartesianSequence = sequences.CartesianProduct();
Изменить сайт звонков:
var cartesianSequence = sequences.Where(a => a.Any(e => e != null)).CartesianProduct();
Вызов Where будет исключать последовательности, в которых все элементы равны нулю.
Чтобы исключить нулевые массивы, а также массивы, содержащие только нулевые значения:
var cartesianSequence = sequences.Where(a => a != null && a.Any(e => e != null)).CartesianProduct();
Или, с пониманием запроса:
var filteredSequences =
from sequence in sequences
where sequence != null && sequence.Any(e => e != null)
select sequence
var cartesianSequence = filteredSequences.CartesianProduct();
EDIT
Другая возможность состоит в том, что вы хотите исключить нулевые элементы каждой последовательности, даже если некоторые элементы не равны нулю:
var filteredSequences =
from sequence in sequences
where sequence != null && sequence.Any(e => e != null)
select (from v in sequence where v.HasValue select s)
var cartesianSequence = filteredSequences.CartesianProduct();
OR
var cartesianSequence = sequences
.Where(s => s != null && s.Any(e => e != null))
.Select(s => s.Where(v => v != null))
.CartesianProduct();
Но трудно точно знать, что посоветовать, поскольку мы не знаем, что вы делаете с результатом.