似乎我再次陷入了递归算法…
我的应用程序应该根据用户指定的信息以及由字符串表示的子文件夹结构,将文件分类到不同的文件夹,如下所示:
[ROOT] \ brand \ color \ material \
结构字符串中的标签表示集合:
承担:
var brand = new List<string> { "Nike", "Adidas", "Reebok" }; var color = new List<string> { "red", "blue", "yellow", "black" }; var material = new List<string> { "leather", "fabric" }; var data = new List<List<string>>() { brand, color, material };
而我想要得到的是这样的:
[ROOT]\Nike\red\leather [ROOT]\Nike\red\fabric [ROOT]\Nike\blue\leather [ROOT]\Nike\blue\fabric [ROOT]\Nike\yellow\leather [ROOT]\Nike\yellow\fabric [ROOT]\Nike\black\leather [ROOT]\Nike\black\fabric [ROOT]\Adidas\red\leather [ROOT]\Adidas\red\fabric [ROOT]\Adidas\blue\leather [ROOT]\Adidas\blue\fabric [ROOT]\Adidas\yellow\leather [ROOT]\Adidas\yellow\fabric [ROOT]\Adidas\black\leather [ROOT]\Adidas\black\fabric [ROOT]\Reebok\red\leather [ROOT]\Reebok\red\fabric [ROOT]\Reebok\blue\leather [ROOT]\Reebok\blue\fabric [ROOT]\Reebok\yellow\leather [ROOT]\Reebok\yellow\fabric [ROOT]\Reebok\black\leather [ROOT]\Reebok\black\fabric
问题在于数据标签的数量(品牌,颜色,材料)及其顺序是未知的,因此需要递归。
任何想法?
提前非常感谢您!
这是Eric Lippert的代码。笛卡尔积..
http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with- linq/
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) { // base case: IEnumerable<IEnumerable<T>> result = new[] { Enumerable.Empty<T>() }; foreach (var sequence in sequences) { var s = sequence; // don't close over the loop variable // recursive case: use SelectMany to build the new product out of the old one result = from seq in result from item in s select seq.Concat(new[] { item }); } return result; }
var result = CartesianProduct(new List<List<string>>() {brand,color,material });
用法示例:
var brand = new List<string> { "Nike", "Adidas", "Reebok" }; var color = new List<string> { "red", "blue", "yellow", "black" }; var material = new List<string> { "leather", "fabric" }; foreach (var row in CartesianProduct(new List<List<string>>() { brand, color, material })) { Console.WriteLine(String.Join(",", row)); }