Получить отдельные предметы LINQ Cartesian Product - PullRequest
0 голосов
/ 05 декабря 2018
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 Ответ

0 голосов
/ 05 декабря 2018

Я думаю, что вы здесь на 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]);
}
...