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,或者,在您的结构周围编写一个包装器,仅用于测试,它知道如何计算子体。