1

我有一个IList<Person>对象。Person 类具有字段、FirstNameLastName等。

我有一个函数,IList<string>我想以IList<Person>对象的相同顺序传入 FirstNames 列表。有没有办法在不使用 Person 列表中的所有名称构建 List 的情况下做到这一点?

如果我可以更改函数以采用不同的参数(除了ILIst<Person>,该函数特定于字符串,而不是 Persons),可能IEnumerable<string>会怎么样?我宁愿使用IList<string>虽然。

4

3 回答 3

4

Enumerable.Select将为您返回一个 IEnumerable 字符串(名字)。

http://msdn.microsoft.com/en-us/library/bb548891.aspx

myFunction(people.Select(o => o.FirstName))

如果你真的想传入一个 ToList(),你也可以添加List

myFunction(people.Select(o => o.FirstName).ToList())

Enumerable.Select是在 C# 3 中作为 LINQ 的一部分引入的方法。在此处阅读有关 LINQ的更多信息。请参阅此处对延迟执行的简要说明。

于 2013-05-21T20:27:18.107 回答
0

您可以让您的方法接受一个IEnumerable<T>(其中 T 是值类型)。例如,public void Foo(IEnumerable<string> firstNames) { ... }。如果您只想遍历列表而不是像IList<T>允许您那样按索引访问它,这将是有效的。

假设您对此没问题,您可以通过执行 LINQ 方法简单地构建一个 Enumerator 对象:myPersonsList.Select(person => person.FirstName);. 由于 Enumerable 工作方式(延迟执行)的性质,它比创建新列表然后迭代它更有效。

于 2013-05-21T20:31:12.870 回答
0

我觉得上面发布的两个答案都可以解决您的问题,但最好使用扩展方法而不是您自己的方法。

粘贴示例供您参考。

class Program
{
    static void Main(string[] args)
    {
        List<Person> persons = new List<Person>();
        persons.Select(c => c.FirstName).DoSomething();
    }
}

public static class StringListExtension
{
    public static int DoSomething(this IEnumerable<string> strList)
    {
        return strList.Count();
    }
}

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
于 2013-05-21T20:48:11.770 回答