Получить отдельные предметы LINQ Cartesian Product

var A = new[] {A, B}; 
var B = new[] {X, Y, Z}; 
var Product = 
from _A in A 
from _B in B 
select new[] { _A, _B };
//Intent below:
foreach (pair in Product)
{
SomeFunction(pair[0],pair[1])
}

//Output:
SomeFunction(A,X)
SomeFunction(A,Y)
SomeFunction(A,Z)
SomeFunction(B,X)
SomeFunction(A,Y)
SomeFunction(A,Z)

Вместо того, чтобы объединить два списка в один элемент, как мне получить _A & _B как независимые переменные? Чтобы для каждой комбинации декартовых кросс-произведений (A,X..A,Y..A,Z..и так далее) я мог отправить их в другую функцию для обработки?

В идеале эти переменные не должны быть строками, поэтому любые обходные пути с получением символа @ обозначения не будут работать.

РЕДАКТИРОВАТЬ: Похоже, я был прав все время. Спасибо за сообщество для подтверждения моего намерения.

1 ответ

Решение

Я думаю, что вы на 95%, и, собрав свой пример, вы на 99%.

Ваш запрос даст вам декартово произведение по вашему желанию.

var A = new[] {A, B}; 
var B = new[] {X, Y, Z}; 
var Product = from _A in A 
              from _B in B 
              select new[] { _A, _B };

Product сейчас и IEnumerable<T>, Это будет выглядеть так:

[
    [A, X]
    [A, Y]
    [A, Z]
    [B, X]
    [B, Y]
    [B, Z]
]

Все, что вам нужно сделать сейчас, это перечислить значения, которые вы имеете в своем намерении (хотя имя переменной неверно):

//Intent below:
foreach (pair in Product)
{
    SomeFunction(pair[0], pair[1]);
}
Другие вопросы по тегам