1

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

ネストされたループであることは知っていますが、理解できない部分は、各リストにリスト文字列を使用する方法です。

4

3 に答える 3

4

デカルト積ではありませんか?

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-16T22:20:38.830 に答える
4
var list = from s1 in list1
           from s2 in list2
           from s3 in list3
           select s1 + " " + s2 + " " + s3;
于 2012-12-16T22:21:02.993 に答える
3
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;
    }
}
于 2012-12-16T22:24:24.323 に答える