C# Linq通过一个列表的列表进行分组并从两个列表中进行选择

C# Linq通过一个列表的列表进行分组并从两个列表中进行选择,c#,linq,C#,Linq,所以我现在很难在Linq的团队中找到自己的头绪,实际上我想从海盗那里获取id和船上的所有信息,理想的情况是将其放入IEnumerable数据行列表中(数据行被隐藏了…) 您可以尝试以下方法: var pirates = new List<Pirate>(); // or wherever your pirates will come from var data = from p in pirates let pirateId = p.Id

所以我现在很难在Linq的团队中找到自己的头绪,实际上我想从海盗那里获取id和船上的所有信息,理想的情况是将其放入IEnumerable数据行列表中(数据行被隐藏了…)

您可以尝试以下方法:

var pirates = new List<Pirate>(); // or wherever your pirates will come from

var data = from p in pirates
           let pirateId = p.Id
           from s in p.Ships
           select new
           {
               PirateId = pirateId,
               Name = s.Name,
               Class = s.ShipClass,
               AvastyMast = s.AvastyMast
           };
然后像这样使用它:

var pirates = new List<Pirate>(); // or wherever your pirates will come from
var dataTable = new DataTable(); // or wherever your DataTable will come from

var data = from p in pirates
           let pirateId = p.Id
           from s in p.Ships
           select CreateDataRow(dataTable , pirateId, s.Name, s.ShipClass, s.AvastyMast);
var=new List();//或者你的海盗从哪里来
var dataTable=新dataTable();//或者无论数据表来自何处
var数据=从p到p
设Id=p.Id
从p.船上的s
选择CreateDataRow(dataTable、pirateId、s.Name、s.ShipClass、s.AvastyMast);
您可以尝试以下方法:

var pirates = new List<Pirate>(); // or wherever your pirates will come from

var data = from p in pirates
           let pirateId = p.Id
           from s in p.Ships
           select new
           {
               PirateId = pirateId,
               Name = s.Name,
               Class = s.ShipClass,
               AvastyMast = s.AvastyMast
           };
然后像这样使用它:

var pirates = new List<Pirate>(); // or wherever your pirates will come from
var dataTable = new DataTable(); // or wherever your DataTable will come from

var data = from p in pirates
           let pirateId = p.Id
           from s in p.Ships
           select CreateDataRow(dataTable , pirateId, s.Name, s.ShipClass, s.AvastyMast);
var=new List();//或者你的海盗从哪里来
var dataTable=新dataTable();//或者无论数据表来自何处
var数据=从p到p
设Id=p.Id
从p.船上的s
选择CreateDataRow(dataTable、pirateId、s.Name、s.ShipClass、s.AvastyMast);
试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Pirate> pirates = new List<Pirate>() {
                    new Pirate() { id = "1" , Ships = new List<Ship>(){
                        new Ship() { name = "Maria", _class = "BattleShip", avastyemast = "You Sunk My Battleship"},
                        new Ship() { name = "Clara", _class = "Scout", avastyemast = "You Sunk My Battleship"}
                    }
                },
                    new Pirate() { id = "2" , Ships =  new List<Ship>() {
                        new Ship() { name = "Boon", _class = "Sub", avastyemast = "You Sunk My Battleship"},
                        new Ship() { name = "Slimer", _class = "Scout", avastyemast = "You Sunk My Battleship"}
                    }
                }
            };

            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("class", typeof(string));
            dt.Columns.Add("avastyemast", typeof(string));

            foreach (Pirate pirate in pirates)
            {
                foreach(Ship ship in pirate.Ships)
                {
                    dt.Rows.Add(new string[] {
                        pirate.id,
                        ship.name,
                        ship._class,
                        ship.avastyemast
                    });
                }

            }


            //using linq
           var newRows = pirates.Select(x => x.Ships.Select(y => new List<object>() {x.id, y.name, y._class, y.avastyemast})).SelectMany(z => z).ToList();
           foreach (var row in newRows)
           {
               dt.Rows.Add(row);
           }
        }
    }
    public class Pirate
    {
        public string id {get;set;} 
        public List<Ship> Ships {get;set;}

    }
    public class Ship
    {
        public string name {get;set;}
        public string _class {get;set;}
        public string avastyemast {get;set;}
    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
列表海盗=新列表(){
new Pirate(){id=“1”,Ships=new List(){
新战舰(){name=“Maria”,“战舰”,avastyemast=“你击沉了我的战舰”},
新战舰(){name=“Clara”、\u class=“Scout”、avastyemast=“你击沉了我的战舰”}
}
},
new Pirate(){id=“2”,Ships=new List(){
新战舰(){name=“Boon”,\u class=“Sub”,avastyemast=“你击沉了我的战舰”},
新战舰(){name=“Slimer”、\u class=“Scout”、avastyemast=“你击沉了我的战舰”}
}
}
};
DataTable dt=新的DataTable();
添加(“id”,类型(字符串));
添加(“名称”,类型(字符串));
添加(“类”,类型(字符串));
添加(“avastyemast”,typeof(string));
foreach(海盗中的海盗)
{
foreach(海盗船,海盗船)
{
dt.Rows.Add(新字符串[]){
海盗身份证,
ship.name,
船舱,
船型
});
}
}
//使用linq
var newRows=pirates.Select(x=>x.Ships.Select(y=>newlist(){x.id,y.name,y.\u class,y.avastyemast})).SelectMany(z=>z.ToList();
foreach(新行中的var行)
{
dt.行。添加(行);
}
}
}
公营海盗
{
公共字符串id{get;set;}
公共列表{get;set;}
}
公船
{
公共字符串名称{get;set;}
公共字符串_类{get;set;}
公共字符串avastyemast{get;set;}
}
}
​
试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Pirate> pirates = new List<Pirate>() {
                    new Pirate() { id = "1" , Ships = new List<Ship>(){
                        new Ship() { name = "Maria", _class = "BattleShip", avastyemast = "You Sunk My Battleship"},
                        new Ship() { name = "Clara", _class = "Scout", avastyemast = "You Sunk My Battleship"}
                    }
                },
                    new Pirate() { id = "2" , Ships =  new List<Ship>() {
                        new Ship() { name = "Boon", _class = "Sub", avastyemast = "You Sunk My Battleship"},
                        new Ship() { name = "Slimer", _class = "Scout", avastyemast = "You Sunk My Battleship"}
                    }
                }
            };

            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("class", typeof(string));
            dt.Columns.Add("avastyemast", typeof(string));

            foreach (Pirate pirate in pirates)
            {
                foreach(Ship ship in pirate.Ships)
                {
                    dt.Rows.Add(new string[] {
                        pirate.id,
                        ship.name,
                        ship._class,
                        ship.avastyemast
                    });
                }

            }


            //using linq
           var newRows = pirates.Select(x => x.Ships.Select(y => new List<object>() {x.id, y.name, y._class, y.avastyemast})).SelectMany(z => z).ToList();
           foreach (var row in newRows)
           {
               dt.Rows.Add(row);
           }
        }
    }
    public class Pirate
    {
        public string id {get;set;} 
        public List<Ship> Ships {get;set;}

    }
    public class Ship
    {
        public string name {get;set;}
        public string _class {get;set;}
        public string avastyemast {get;set;}
    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
列表海盗=新列表(){
new Pirate(){id=“1”,Ships=new List(){
新战舰(){name=“Maria”,“战舰”,avastyemast=“你击沉了我的战舰”},
新战舰(){name=“Clara”、\u class=“Scout”、avastyemast=“你击沉了我的战舰”}
}
},
new Pirate(){id=“2”,Ships=new List(){
新战舰(){name=“Boon”,\u class=“Sub”,avastyemast=“你击沉了我的战舰”},
新战舰(){name=“Slimer”、\u class=“Scout”、avastyemast=“你击沉了我的战舰”}
}
}
};
DataTable dt=新的DataTable();
添加(“id”,类型(字符串));
添加(“名称”,类型(字符串));
添加(“类”,类型(字符串));
添加(“avastyemast”,typeof(string));
foreach(海盗中的海盗)
{
foreach(海盗船,海盗船)
{
dt.Rows.Add(新字符串[]){
海盗身份证,
ship.name,
船舱,
船型
});
}
}
//使用linq
var newRows=pirates.Select(x=>x.Ships.Select(y=>newlist(){x.id,y.name,y.\u class,y.avastyemast})).SelectMany(z=>z.ToList();
foreach(新行中的var行)
{
dt.行。添加(行);
}
}
}
公营海盗
{
公共字符串id{get;set;}
公共列表{get;set;}
}
公船
{
公共字符串名称{get;set;}
公共字符串_类{get;set;}
公共字符串avastyemast{get;set;}
}
}
​

您的问题不是很清楚。什么是输入,什么是预期的输出?
从海盗那里获取id和船上的所有信息,理想的情况是放入IEnumerable列表。
What?您的代码不会编译<代码>类是保留关键字。这些是私人领域吗?或者它们应该是公共属性?做了一些小的编辑,很抱歉造成混乱,我只是把这两个类作为我正在处理的对象的一个例子。将立即进行更多编辑。
DataRow
应包含哪些字段?您的问题不太清楚。Wh