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# 如何获得Linq中所有子列表、孙子列表、曾孙列表等的计数_C#_Linq - Fatal编程技术网

C# 如何获得Linq中所有子列表、孙子列表、曾孙列表等的计数

C# 如何获得Linq中所有子列表、孙子列表、曾孙列表等的计数,c#,linq,C#,Linq,我有一个模型,它有一个对象列表,它有一个对象列表,它有一个对象列表等等。我想做的是以一种很好的方式获得所有子对象的计数 我建立了以下示例: 这是我的模型: public class Model { public List<GrandParent> GrandParents { get; set; } } 公共类模型 { 公共列表祖父母{get;set;} } 这些是我的目标: public class GrandParent { public string Nam

我有一个模型,它有一个对象列表,它有一个对象列表,它有一个对象列表等等。我想做的是以一种很好的方式获得所有子对象的计数

我建立了以下示例:

这是我的模型:

public class Model
{
    public List<GrandParent> GrandParents { get; set; }
}
公共类模型
{
公共列表祖父母{get;set;}
}
这些是我的目标:

public class GrandParent
{
    public string Name { get; set; }
    public List<Parent> Parents { get; set; }
}

public class Parent
{
    public string Name { get; set; }
    public List<Child> Children { get; set; }
}

public class Child
{
    public string Name { get; set; }
    public List<Friend> Friends { get; set; }
}

public class Friend
{
    public string Name { get; set; }
}
公共类祖父母
{
公共字符串名称{get;set;}
公共列表父项{get;set;}
}
公共类父类
{
公共字符串名称{get;set;}
公共列表子项{get;set;}
}
公营儿童
{
公共字符串名称{get;set;}
公共列表朋友{get;set;}
}
公课朋友
{
公共字符串名称{get;set;}
}
以下是我在控制台应用程序中的设置:

static void Main(string[] args)
    {
        var friendOne = new Friend { Name = "Friend 1" };
        var childOne = new Child { Name = "Child 1", Friends = new List<Friend>() };
        var childTwo = new Child { Name = "Child 2", Friends = new List<Friend> { friendOne } };
        var parentOne = new Parent { Name = "Parent 1", Children = new List<Child> { childOne, childTwo } };
        var grandParentOne = new GrandParent { Name = "GrandParent 1", Parents = new List<Parent> { parentOne } };

        var model = new Model { GrandParents = new List<GrandParent> { grandParentOne } };

        var count = model.GrandParents.Count +
            model.GrandParents
                .Sum(gp => gp.Parents.Count + gp.Parents
                .Sum(p => p.Children.Count + p.Children
                .Sum(c => c.Friends.Count)));

        Console.WriteLine(count);
        Console.ReadLine();
    }
static void Main(字符串[]args)
{
var-friendOne=新朋友{Name=“friend1”};
var childOne=newchild{Name=“Child 1”,Friends=newlist()};
var childTwo=newchild{Name=“Child 2”,Friends=newlist{friendOne};
var parentOne=new Parent{Name=“Parent 1”,Children=new List{childOne,childTwo};
var祖父母=新祖父母{Name=“祖父母1”,父母=新列表{parentOne};
var模型=新模型{祖父母=新列表{祖父母};
var count=model.GrandParents.count+
模范祖父母
.Sum(gp=>gp.Parents.Count+gp.Parents
.Sum(p=>p.Children.Count+p.Children
.Sum(c=>c.Friends.Count));
控制台写入线(计数);
Console.ReadLine();
}

所以我有5个对象(1个朋友,2个孩子,1个父母和1个祖父母),这是我的计数变量给我的。但是我不喜欢我在linq查询中使用的方式,是否有更好/更干净的方法来执行此操作?

正如在注释中提到的,一种方法是对树中的所有节点使用相同的对象,并且可以编写递归的内容

另一种方法是,如果您想保留这些对象,可以使它们都实现一个接口,该接口只知道如何计算后代

public interface IHasDescendents
{
   int CountOfDescendents();
}
通过为所有类实现该接口,您的代码将

var count = model.GrandParents.Sum(gp => 1 + gp.CountOfDescendents());

我怀疑您可以实现这些细节,但如果不只是注释,我将向您展示如何实现。

因此您有可用的代码,这是一个为
祖父母
父母
等设置不同类的问题?如果只有一种类型,比如带有亲属列表的
Person
,则可以创建一种简短的递归方法。但也许这并不是你认为的“更好/更干净”。@RenéVogt是的,必须有不同的类,这只是一个例子。问问Ben。。。。。。。。(EnumerateHierarchy)我不想编写获取对象计数的特定方法。我需要的这个计数实际上是测试断言所必需的,所以我不想更改测试的实现。@Viqas-huh?所以你想要一个神奇的解决方案,你不需要改变任何事情。好啊祝你好运顺便说一句-您可以显式实现接口,使其在类本身上不可见,但测试可以强制转换到接口以进行断言。@Viqas,或者,在您的结构周围编写一个包装器,仅用于测试,它知道如何计算子体。