gpt4 book ai didi

C#:是否有 LINQ 方法在给定构造函数参数数组的情况下创建对象数组?

转载 作者:IT王子 更新时间:2023-10-29 04:32:26 24 4
gpt4 key购买 nike

举个例子,假设我有一个名字数组,我想通过调用一个采用string name 的构造函数来创建一个Person 对象数组。

class Person()
{
public string Name { get; set; }

public Person(string name)
{
Name = name;
}
}

...

static void Main()
{
string[] names = {"Peter", "Paul", "Mary"};
Person[] people;

/* I could do this but I'm wondering if there's a better way. */
List<Person> persons = new List<Person>();
foreach(string name in names)
{
persons.Add(new Person(name));
}

people = persons.ToArray();
}

我已经在 .Net 2.0 世界中呆了太久了,我正在尝试在当前的停机时间实现现代化...

最佳答案

// names is string[]
Person[] people = names.Select(s => new Person(s)).ToArray();

解释:

Enumerable.Select 是用于投影的 LINQ 方法。也就是说,采用 Foo 的序列s 并将它们投影到 Bar通过一些规则 Func<Foo, Bar>Foo s 并吐出 Bar秒。因此

names.Select(s => new Person(s))

是序列 names 的投影类型 IEnumerable<string>IEnumerable<Person> 类型的序列.如果您了解函数式编程,它会扮演 map 的角色。 .

现在,这里有一个微妙的点值得理解;这几乎可以肯定是 LINQ 最重要但最容易被误解的方面之一。这就是延迟执行的概念。当我们说

IEnumerable<Person> persons = names.Select(s => new Person(s));

这实际上并没有执行投影(即,它还没有创建使用 Person 中的 string 作为构造函数参数构造的 names 的实例)。相反,它创建了一些东西来捕获如何投影序列 names 的规则。进入 Person 的序列.只有当该规则(称为迭代器)实际执行时,投影才会发生。

导致此执行发生的一种方法是使用方法 Enumerable.ToArray 这基本上是说遍历序列并将结果作为数组返回给我。

还有其他方法可以使执行发生。例如

IEnumerable<Person> persons = names.Select(s => new Person(s)); 
foreach(Person p in persons) {
Console.WriteLine(p.Name);
}

IEnumerable<Person> persons = names.Select(s => new Person(s)); 
Person p = persons.First();

这将执行“第一个”投影(即 new Person(names[0] ))并将结果分配给 p .

当然,这还没有深入到什么地方

s => new Person(s)

是。那是一个 lambda 表达式,你可以在我对 How does this LINQ Expression work? 的回答中得到它们的介绍。 .

关于C#:是否有 LINQ 方法在给定构造函数参数数组的情况下创建对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2113115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com