73149


例えば、次のクラスのListがあるとします。

[code]

    public class A
            {
                public string Name { get; set; }
                public List<int> Items { get; set; }
            }
    
    List<A> As = new List<A>();
    As.Add(new A() { Name = "a", Items = new List<int>() { 1, 2, 3 } });
                As.Add(new A() { Name = "b", Items = new List<int>() { 1,2,3 } });
                As.Add(new A() { Name = "c", Items = new List<int>() {  } });
    
[/code]

これをこのようなリスト構造にしたいです。

Itemだけであれば `SelectMany()` を使えばよいのですが、各ItemのNameもほしいです。  
C#のLinqでどのように書けばよろしいでしょうか。

Name | Item  
---|---  
a | 1  
a | 2  
a | 3  
b | 1  
b | 2  
b | 3  
c | 4  
c | 5  
c | 6


CC BY-SA 4.0
2021-01-07T23:54:23.377
73147
2021-01-08T00:34:37.417
2021-01-08T00:21:10.767
3060
12388
question
c#
C#のList<T>を非正規化状態にしたい


SelectManyの[各要素に適用する変換関数](https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.selectmany?redirectedfrom=MSDN&view=net-5.0#System_Linq_Enumerable_SelectMany__2_System_Collections_Generic_IEnumerable___0__System_Func___0_System_Collections_Generic_IEnumerable___1___)を使用することで実現できます。  
[参考資料](https://www.urablog.xyz/entry/2018/05/28/070000#SelectMany%E3%82%92%E4%BD%BF%E3%81%86)

※ご質問のコードにName="c"のItemsが入っていないのは記入漏れと想定して補完しています。

**サンプルコード**

[code]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<A> As = new List<A>();
                As.Add(new A() { Name = "a", Items = new List<int>() { 1, 2, 3 } });
                As.Add(new A() { Name = "b", Items = new List<int>() { 1, 2, 3 } });
                As.Add(new A() { Name = "c", Items = new List<int>() { 4, 5, 6 } });
                // SelectManyによる射影変換と平坦化
                var namedAs = As.SelectMany(a => a.Items, (a, i) => new { a.Name, Item = i });
                namedAs.ToList().ForEach(nA => Console.WriteLine("Name: {0}, Item: {1}", nA.Name, nA.Item));
                Console.ReadLine();
            }
        }
        public class A
        {
            public string Name { get; set; }
            public List<int> Items { get; set; }
        }
    }
    
[/code]

**実行結果**

[code]

    Name: a, Item: 1
    Name: a, Item: 2
    Name: a, Item: 3
    Name: b, Item: 1
    Name: b, Item: 2
    Name: b, Item: 3
    Name: c, Item: 4
    Name: c, Item: 5
    Name: c, Item: 6
    
[/code]


CC BY-SA 4.0
2021-01-08T00:34:37.417
73149
2021-01-08T00:34:37.417
9820
73147
answer