我正在尝试弄清楚如何使用C#创建一个单一的连接列表,该列表来自3个单独的列表。例如:
List 1: Ugly, Pretty
List 2: Dogs, Carts, Pigs
List 3: Rock, Suck输出:
Ugly Dogs Rock
Ugly Dogs Suck
Ugly Cats Rock
Ugly Cats Suck
Ugly Pigs Rock
Ugly Pigs Suck
Pretty Dogs Rock
Pretty Dogs Suck
Pretty Cats Rock
Pretty Cats Suck
Pretty Pigs Rock
Pretty Pigs Suck我知道这只是嵌套循环,但我不能理解的是如何对每个列表使用列表字符串。
发布于 2012-12-17 06:21:03
var list = from s1 in list1
from s2 in list2
from s3 in list3
select s1 + " " + s2 + " " + s3;发布于 2012-12-17 06:20:39
它不是笛卡尔乘积吗?
var r = from i1 in list1
from i2 in list2
from i3 in list3
select new { i1, i2, i3 };
// or String.Format("{0} {1} {2}", i1, i2, i3);发布于 2012-12-17 06:24:24
List<string> list1 = new List<string>(){ "Ugly", "Pretty"};
List<string> list2 = new List<string>(){ "Dogs", "Carts", "Pigs"};
List<string> list3 = new List<string>(){ "Rock", "Suck"};
var result = from s1 in list1
from s2 in list2
from s3 in list3
select new[] { s1, s2, s3 };
foreach (var item in result)
{
Console.WriteLine(String.Join(",", item));
}如果你正在寻找一个更通用的解决方案,不仅仅是3个列表,你可以尝试Eric Lippert的解决方案
foreach (var item in new[] { list1, list2, list3 }.CartesianProduct())
{
Console.WriteLine(String.Join(",", item));
}public static partial class MyExtensions
{
// Eric Lippert’s Blog
// Computing a Cartesian Product with LINQ
// http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx
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;
}
}https://stackoverflow.com/questions/13906032
复制相似问题