给定数字(C#)的单个列表中数字的笛卡尔乘积
我只想得到一个列表中的数字的笛卡尔积,该列表中的数字以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
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));