当前位置: 首页 > 编程语言 > C#

是否有一种LINQ方法可以在给定构造函数参数数组的情况下创建对象数组?

时间:2023-04-10 20:05:56 C#

C#:是否有一种LINQ方法可以在给定构造函数参数数组的情况下创建对象数组?例如,假设我有一个名称数组,我想通过调用具有字符串名称的构造函数来创建一个Person对象数组。类Person(){公共字符串名称{get;放;}publicPerson(stringname){Name=name;}}...staticvoidMain(){string[]names={"Peter","Paul","Mary"};人[]人;/*我可以这样做,但我想知道是否有更好的方法。*/列出人员=newList();foreach(名称中的字符串名称){persons.Add(newPerson(name));}people=persons.ToArray();我在.Net2.0世界中呆了太久了,我正在尝试在当前停机期间实现现代化...//namesisstring[]Person[]people=names.Select(s=>newPerson(s)).ToArray();说明:Enumerable.Select是一种用于投影的LINQ方法。也就是说,获取Foo的数组并通过一些规则Func将它们投射到Bar中,该规则Func吃掉Foo并吐出Bar。因此names.Select(s=>newPerson(s))是IEnumerable类型的序列名称到IEnumerable类型序列的投影。如果你了解函数式编程,它就扮演着地图的角色。现在,这里有一个值得理解的微妙点;这几乎可以肯定是LINQ最重要但最容易被误解的方面之一。这就是延迟执行的概念。当我们说IEnumerablepersons=names.Select(s=>newPerson(s));这实际上并没有执行投影(即它还没有创建用名称的字符串s作为构造函数参数构造的Person实例)。相反,它创建了一些东西来捕获序列名称如何投影到Person序列中的规则。只有在实际执行该规则(称为迭代器)时才会发生投影。导致这样做的一种方法是使用Enumerable.ToArray方法,它基本上表示迭代序列并将结果作为数组返回给我。还有其他方法可以导致执行。例如IEnumerablepersons=names.Select(s=>newPerson(s));foreach(Personpinpersons){Console.WriteLine(p.Name);}或IEnumerablepersons=names.Select(s=>newPerson(s));人p=persons.First();它将执行“第一个”投影(即newPerson(names[0]))并将结果分配给p。当然,这甚至不能完成s=>newPerson(s)的功能。这是一个lambda表达式,您可以在我对此LINQ表达式如何工作的回答中获得对它们的介绍。.我发布了这个,其他人需要一个稍微不同的场景。这是我的情况,我使用杰森的回答来实现我的目标。假设您有一个包含人名和职位的类,并且您想要填充该对象:publicclassEmployee{privatestringname;私有字符串jobTitle;publicEmployee(){}publicEmployee(stringname,stringjob){这个。名字=名字;this.jobTitle=工作;}//getters+setters...}然后你做varIQueryablelist=frompincontext.Personsjoinjincontext.Jobsonp.jobId==j.jobIdselectnewEmployee(p.Name,j.Title);然后你将遍历列表以获取实例以上是C#学习教程:C#:IsthereaLINQwaytocreateanarrayofobjectsgivenanarrayofconstructorarguments?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: