Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接3个单词列表_C#_List_Concatenation_Nested Loops - Fatal编程技术网

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

我试图弄清楚如何使用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

我知道这只是嵌套循环,但我搞不清楚的是如何为每个列表使用列表字符串。

这不是笛卡尔积吗

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;
    }
}