Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/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# 如何将嵌套对象从一种类型转换为另一种类型_C#_Linq_Lambda_Mapping - Fatal编程技术网

C# 如何将嵌套对象从一种类型转换为另一种类型

C# 如何将嵌套对象从一种类型转换为另一种类型,c#,linq,lambda,mapping,C#,Linq,Lambda,Mapping,我有一个C#对象,其结构如下 class Source { public int Id {get; set;} public List<Source> Children {get; set;} } 是否有一种方法可以使用LINQ来实现这一点,或者我必须遍历所有对象并映射它。您可以这样做: List<A> alist = new List<A>(); List<B> blist = alist.Select(a =

我有一个C#对象,其结构如下

class Source 
{
    public int Id {get; set;}
    public List<Source> Children {get; set;}
}
是否有一种方法可以使用LINQ来实现这一点,或者我必须遍历所有对象并映射它。

您可以这样做:

    List<A> alist = new List<A>();
    List<B> blist = alist.Select(a => new B()).ToList();


    public class A
    {}

    public class B
    {}
List alist=newlist();
List blist=alist.Select(a=>newb()).ToList();
公共A类
{}
公共B级
{}

您可以执行如下递归操作:

public class Source
{
    public int Id { get; set; }
    public List<Source> Children { get; set; }

    public Destination GetDestination()
    {
        return new Destination
        {
            nodes = Children.Select(c => c.GetDestination()).ToList(),
            key = Id
        };
    }
}
公共类源代码
{
公共int Id{get;set;}
公共列表子项{get;set;}
公共目的地GetDestination()
{
返回新目的地
{
节点=子节点。选择(c=>c.GetDestination()).ToList(),
key=Id
};
}
}

可以尝试向接受源作为参数的目标类添加构造函数:

class Destination
{
    public int key {get; set;}
    public List<Destination> nodes {get; set;}

    public Destination(Source source)
    {
        Key = source.Id;
        Nodes = source.Select(s => new Destination(s)).ToList();
    }
}

这可能会永远运行,可能还没有尝试过。

您可以只做一个
选择
和一个
列表
并在初始值设定项中设置它,而不是
ForEach
。这将是一种更为灵巧的方法。但最重要的是递归,你不需要重新建立一个列表。只需将
ToList
的返回设置为节点,它就会工作。感谢k4rlsson和@juharr的帮助。
class Destination
{
    public int key {get; set;}
    public List<Destination> nodes {get; set;}

    public Destination(Source source)
    {
        Key = source.Id;
        Nodes = source.Select(s => new Destination(s)).ToList();
    }
}
var destinations = sources.Select(s => new Destination(s)).ToList();