我有一个IList<Person>
个对象。 Person类包含字段FirstName
,LastName
等
我有一个带IList<string>
的函数,我希望以IList<Person>
对象的相同顺序传递FirstNames列表。有没有办法在不使用人员列表中的所有名称构建List的情况下执行此操作?
如果我可以将函数更改为使用不同的参数(ILIst<Person>
除外,该函数特定于字符串,而不是人员),可能IEnumerable<string>
怎么办?我宁愿使用IList<string>
。
答案 0 :(得分:4)
Enumerable.Select
将为您返回一个IEnumerable字符串(名字)。
http://msdn.microsoft.com/en-us/library/bb548891.aspx
myFunction(people.Select(o => o.FirstName))
如果你真的想要传递List
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; }
}