2015-02-20 9 views
0

Я просто хочу получить декартовое произведение чисел в одном списке с указанным числом в C#. В ниже я привел некоторые примеры того, на самом деле, что я хочу попасть:Декартово произведение чисел в одном списке с заданным числом (C#)

List<int> numbers = new List<int>() { 0, 1, 2 }; 

Там должно быть функцией, чтобы получить все декартово произведение, что числа с заданным числом п.

Например, п = 2, то выход должен быть таким:

0,0 
0,1 
0,2 
1,0 
1,1 
1,2 
2,0 
2,1 
2,2 

Есть ли какие-либо предложения или примеры для этого?

+2

Используйте поисковую систему. http://stackoverflow.com/questions/13647662/generating-a-n-ary-cartesian-product-example –

+0

Эта функция не встроена в язык. –

+0

Спасибо за ответы, но я должен сделать это с одним списком, а также эффективно. Для этого должно быть отличное решение. – mrciga

ответ

2

Пока вы только хотите создать декартово произведение двух наборов вы можете использовать LINQ SelectMany:

var n = 2; 
var numbers = Enumerable.Range(0, n + 1); 
var cartesianProduct = numbers.SelectMany(_ => numbers, (a, b) => Tuple.Create(a, b)); 

Когда cartesianProduct перечисляется он будет генерировать 9 кортежи точно так, как вы укажете в вашем вопросе.

Если вам необходимо создать декартовы продукты более высоких размеров it is better to use recursion.

+0

Мне интересно, использую ли я 'var a = s.SelectMany (_ => s.Where (z => z> _), (x, y) => new [] {x, y})' для создания всех устанавливает, где ни один из чисел (или чисел) не равен и еще не был представлен в обратном порядке (например, если мне {1,2} мне не нужно {2,1}); будет ли этот оператор linq/lambda быть более быстрым, а затем два для петель, который равен O (n^2)? – Edward

+1

@Edward: LINQ (в данном случае «LINQ to objects») не обладает магическими полномочиями. Когда вы перечисляете выражение LINQ (в вашем случае 's'), он будет выполнять' SelectMany' как два вложенных цикла foreach, а сложность будет выполняться с помощью 'O (n^2)'. Фактически, ручная запись циклов может привести к чуть более эффективному коду, а не с точки зрения сложности, а с точки зрения времени выполнения, потому что вы можете избежать некоторых распределений. Однако для чего-либо, кроме действительно критического кода производительности, я всегда предпочитаю LINQ, поскольку он позволяет мне писать более компактный, многоразовый и выразительный код. –