C# 连接3个单词列表
我试图弄清楚如何使用C创建一个单独的连接列表,它来自3个单独的列表。例如:C# 连接3个单词列表,c#,list,concatenation,nested-loops,C#,List,Concatenation,Nested Loops,我试图弄清楚如何使用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 Prett
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
我知道这只是嵌套循环,但我搞不清楚的是如何为每个列表使用列表字符串。这不是笛卡尔积吗
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);
这不是笛卡尔积吗
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);
我建议在select语句中使用其他语句,因为当前有过多的连接,因此内存使用量过大。@abatishchev实际上不会有问题。当您连接2或3个字符串时,编译器将生成对String.Concatstr1、str2、str3的调用,该调用使用FastAllocateString创建新字符串。这甚至比在String.Format调用中创建新的StringBuilder更有效。但在这种特殊情况下,OP希望使用空格分隔的字符串,所以这就是为什么应该使用格式的原因。@lazyberezovsky-我也这么想,并对它进行了测试:将它与a++b++c连接起来比string.format快30%左右。@lazyberezovsky:不要坚持认为格式更好,很可能不是。一般情况下,字符串连接您和我的代码段都是无效的。@abatishchev同意,但性能比较格式和连接不会受到影响,在这种情况下,可读性会受到影响,我更喜欢格式。我建议在select语句中使用其他语句,因为当前有过多的连接,因此内存使用量过大。@abatishchev实际上不会有问题。当您连接2或3个字符串时,编译器将生成对String.Concatstr1、str2、str3的调用,该调用使用FastAllocateString创建新字符串。这甚至比在String.Format调用中创建新的StringBuilder更有效。但在这种特殊情况下,OP希望使用空格分隔的字符串,所以这就是为什么应该使用格式的原因。@lazyberezovsky-我也这么想,并对它进行了测试:将它与a++b++c连接起来比string.format快30%左右。@lazyberezovsky:不要坚持认为格式更好,很可能不是。一般情况下,字符串连接您和我的代码段都是无效的。@abatishchev同意,但性能比较格式和连接不会受到影响。在这种情况下,可读性会受到影响,我更喜欢格式所以,如果我想把结果放到一个新的列表中并打印到一个新的文本框中,我会这样做吗?textBox_MergeListResults.Text=string.Join\r\n,这里是什么@Jeagr textBox\u MergeListResults.Text=String.JoinEnvironment.NewLine,result.Selectx=>String.Join,x;工作得很好!谢谢。出于某种原因,当我将文本复制到剪贴板时,结果是错误的……有什么想法吗?文本框显示一切正常,但粘贴的文本在其自己的行上显示每个项目…就像\n没有复制到剪贴板。@Jeagr你真的认为你的复制/粘贴问题与你的问题有关吗?L.B。-那么,如果我想将结果转到一个新列表并打印到一个新的文本框,我会这样做吗?textBox_MergeListResults.Text=string.Join\r\n,这里是什么@Jeagr textBox\u MergeListResults.Text=String.JoinEnvironment.NewLine,result.Selectx=>String.Join,x;工作得很好!谢谢。出于某种原因,当我将文本复制到剪贴板时,结果是错误的……有什么想法吗?文本框显示一切正常,但粘贴的文本在其自己的行上显示每个项目…就像\n没有复制到剪贴板上一样。@Jeagr您真的认为复制/粘贴问题与您的问题有关吗?
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));
}
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;
}
}