从IList <object_type> </object_type> </field_type>获取IList <field_type>

时间:2013-05-21 20:24:00

标签: c# linq ilist

我有一个IList<Person>个对象。 Person类包含字段FirstNameLastName

我有一个带IList<string>的函数,我希望以IList<Person>对象的相同顺序传递FirstNames列表。有没有办法在不使用人员列表中的所有名称构建List的情况下执行此操作?

如果我可以将函数更改为使用不同的参数(ILIst<Person>除外,该函数特定于字符串,而不是人员),可能IEnumerable<string>怎么办?我宁愿使用IList<string>

3 个答案:

答案 0 :(得分:4)

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

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

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

如果你真的想要传递List

,你也可以添加ToList()

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

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

答案 1 :(得分:0)

您可以让您的方法接受IEnumerable<T>(其中T是值类型)。例如,public void Foo(IEnumerable<string> firstNames) { ... }。如果您只想迭代列表而不是通过索引访问它,那么这将是有效的,因为IList<T>可以让您这样做。

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

答案 2 :(得分: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; }
}