Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定数字(C#)的单个列表中数字的笛卡尔乘积_C#_List_Combinations_Cartesian Product_Cartesian - Fatal编程技术网

给定数字(C#)的单个列表中数字的笛卡尔乘积

给定数字(C#)的单个列表中数字的笛卡尔乘积,c#,list,combinations,cartesian-product,cartesian,C#,List,Combinations,Cartesian Product,Cartesian,我只想得到一个列表中的数字的笛卡尔积,该列表中的数字以C#表示。在下文中,我给出了一些我想要得到的实际例子: List<int> numbers = new List<int>() { 0, 1, 2 }; 对此有什么建议或示例吗?只要您只想创建两个集合的笛卡尔乘积,就可以使用LINQSelectMany: var n = 2; var numbers = Enumerable.Range(0, n + 1); var cartesianProduct = number

我只想得到一个列表中的数字的笛卡尔积,该列表中的数字以C#表示。在下文中,我给出了一些我想要得到的实际例子:

List<int> numbers = new List<int>() { 0, 1, 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个元组,与您在问题中指定的完全相同


如果您必须创建更高维度的笛卡尔积。

请使用搜索引擎。这个函数不是内置在语言中的。谢谢你的回答,但我应该用单一列表来实现,而且效率很高。应该有一个很好的解决方案。看看Linq SelectMany,看看标记此dup的人;问题。这不是更具体的一个列表的自连接,而不是多个集合的产品吗?因此,尽管可以用更通用的dup来回答这个问题,但它有一个更简单的解决方案,就是具体的。我想知道我是否使用
var a=s.SelectMany(=>s.Where(z=>z>),(x,y)=>new[]{x,y})
来生成所有整数(或数字)都不相等且还没有反向表示的集合(例如,如果我有{1,2},我不需要){2,1});这个linq/lambda语句在性能上会比O(n^2)的两个for循环更快吗?@Edward:linq(在本例中为“linq to objects”)没有魔力。当您枚举linq表达式时(在本例中为
s
)它将执行
SelectMany
作为两个嵌套的
foreach
循环,复杂性将按
O(n^2)计算
。事实上,手工编写循环可以提高代码的效率,不是在复杂性方面,而是在执行时间方面,因为您可以避免一些分配。但是,对于真正性能关键的代码以外的任何代码,我总是更喜欢LINQ,因为它允许我编写更紧凑、可重用和表达性更强的代码。
var n = 2;
var numbers = Enumerable.Range(0, n + 1);
var cartesianProduct = numbers.SelectMany(_ => numbers, (a, b) => Tuple.Create(a, b));