Getting an IList<field_type> from IList<object_type
本文关键字:lt type IList from object gt field an Getting | 更新日期: 2023-09-27 18:14:36
我有一个IList<Person>
对象。Person类有字段,FirstName
, LastName
等
我有一个接受IList<string>
的函数,我想以与IList<Person>
对象相同的顺序传递FirstNames列表。有没有一种方法可以做到这一点,而不需要从Person列表中建立所有名称的列表?
如果我可以改变函数以采用不同的参数(除了ILIst<Person>
,该函数特定于字符串,而不是人物),也许是IEnumerable<string>
?我宁愿使用IList<string>
Enumerable.Select
将为您返回一个IEnumerable字符串(名字)。
myFunction(people.Select(o => o.FirstName))
如果你真的想传递一个List
myFunction(people.Select(o => o.FirstName).ToList())
Enumerable.Select
是c# 3中作为LINQ的一部分引入的方法。在这里阅读更多关于LINQ的信息。请在这里查看延迟执行的简要解释
您可以让您的方法接受IEnumerable<T>
(其中T是值类型)。例如:public void Foo(IEnumerable<string> firstNames) { ... }
。如果你只是想迭代列表,而不是像IList<T>
那样通过索引访问它,这将是有效的。
假设您对此没有问题,您可以通过执行LINQ方法来简单地构建一个Enumerator对象:myPersonsList.Select(person => person.FirstName);
。由于Enumerable的工作性质(延迟执行),它比创建一个新列表,然后遍历它更有效。
我觉得上面的答案都能解决你的问题,但最好使用扩展方法,而不是你自己的方法。
粘贴示例供参考。
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; }
}