内容简介:我有一个未知数量的桶(集合),每个桶具有未知数量的实体我需要生成所有实体的笛卡尔积,这样我最终得到一个具有ARRAYS实体的COLLECTION,并且在每个数组中,每个桶都有1个代表性.因此,如果我有5个桶(B1..B5),并且桶B1,B2各有1个项目,而桶B3,B4和B5各有4个,8个和10个项目,我将收集320个数组,每个数组将有5个项目.
我有一个未知数量的桶(集合),每个桶具有未知数量的实体
我需要生成所有实体的笛卡尔积,这样我最终得到一个具有ARRAYS实体的COLLECTION,并且在每个数组中,每个桶都有1个代表性.
因此,如果我有5个桶(B1..B5),并且桶B1,B2各有1个项目,而桶B3,B4和B5各有4个,8个和10个项目,我将收集320个数组,每个数组将有5个项目.
这里唯一的麻烦问题是,在开发时,桶的大小和桶的数量都是未知的.
性能在这里并不是非常重要,因为在大多数情况下,我的桶只有1个实体,而且很少有时候我的桶会包含20-30个项目…而且我通常会有5个30桶
我想在某种程度上利用linq,但是当我试图想象这是如何工作的时候,我的大脑正在变得油腻
您可以创建如下的扩展方法:
public static class EnumerableExtensions
{
public static IEnumerable<TValue []> Permutations<TKey, TValue>(this IEnumerable<TKey> keys, Func<TKey, IEnumerable<TValue>> selector)
{
var keyArray = keys.ToArray();
if (keyArray.Length < 1)
yield break;
TValue [] values = new TValue[keyArray.Length];
foreach (var array in Permutations(keyArray, 0, selector, values))
yield return array;
}
static IEnumerable<TValue []> Permutations<TKey, TValue>(TKey [] keys, int index, Func<TKey, IEnumerable<TValue>> selector, TValue [] values)
{
Debug.Assert(keys.Length == values.Length);
var key = keys[index];
foreach (var value in selector(key))
{
values[index] = value;
if (index < keys.Length - 1)
{
foreach (var array in Permutations(keys, index+1, selector, values))
yield return array;
}
else
{
yield return values.ToArray(); // Clone the array;
}
}
}
}
例如,它可以像:
public static void TestPermutations()
{
int [][] seqence = new int [][]
{
new int [] {1, 2, 3},
new int [] {101},
new int [] {201},
new int [] {301, 302, 303},
};
foreach (var array in seqence.Permutations(a => a))
{
Debug.WriteLine(array.Aggregate(new StringBuilder(), (sb, i) => { if (sb.Length > 0) sb.Append(","); sb.Append(i); return sb; }));
}
}
并产生以下输出:
1,101,201,301 1,101,201,302 1,101,201,303 2,101,201,301 2,101,201,302 2,101,201,303 3,101,201,301 3,101,201,302 3,101,201,303
那是你要的吗?
翻译自:https://stackoverflow.com/questions/27328235/dynamically-cross-join-multiple-different-size-collections-together-in-linq-c
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- python中将list转为dict
- Spring中将header头转换为参数
- 数组 – 如何在Swift中将数组拆分成两半?
- postgresql – 在postgres中将表列名更改为大写
- 如何在Java 8中将List转换为Map?
- 如何在Kubernetes中将Envoy用作负载均衡器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
个性化网页设计与鉴赏
梁景红 / 西安电子科技大学出版社 / 2003-07-14 / 22.00
本书比较全面地介绍了网页设计应注意的相关问题, 在网页设计基础方面着重讲解了网页框架、页面元素、色彩设计,分析了一些人们容易忽视的细小环节,如页面装饰物、图片、文字、连接等。书中结合实例分析了优秀网页的设计创意思想,可以给读者提供一些启示。书中还介绍了作为网页设计者需要了解的信息管理和技术应用,以及网站VI设计和视觉美学等必要知识,读者可针对各种类别的站点具体实践这些知识,寻找进行网页设计的切入点......一起来看看 《个性化网页设计与鉴赏》 这本书的介绍吧!