我有以下C#代码:
List<string> names = new List<string>();
if (myObject.myClass != null)
{
foreach (var foo in myObject.myClass.subClass)
{
names.Add(foo.Name);
}
}
是否有更短的编写方式而无需遍历subClass
的每个实例以将myObject.myClass.subClass.Name
添加到names
List<string>
对象中?
同时考虑到myObject.myClass
可以为空。
答案 0 :(得分:4)
听起来你可以使用:
List<string> names = myObject.myClass == null
? new List<string>()
: myObject.myClass.subclass.Select(x => x.Name).ToList();
请注意,此表达式:myObject.myClass.subclass
表明您违反了Law of Demeter,而且希望命名实际上并不反映现实......如果你可以提供更具指示性的表达式,这将有很大的帮助。
答案 1 :(得分:4)
您可以使用AddRange
方法将IEnumerable
的所有元素添加到列表中:
if (myObject.myClass != null) {
names.AddRange(myObject.myClass.subClass.Select(c => c.Name));
}
答案 2 :(得分:1)
您可以在列表中使用AddRange方法。
答案 3 :(得分:0)
您可以使用LINQ构建列表,但请注意,它仍然是枚举以构建列表:
var names = myObject.myClass.subClass.Select(x => x.Name).ToList();
答案 4 :(得分:0)
目前尚不清楚什么是集合,什么不是。所以我假设myObject.myClass
已经是一个集合(IEnumerable<myClass>
),可以为null,myClass.subClass
是IEnumerable<subClass>
,你想要他们所有的名字。
var classNames = from c in myObject.myClass
where c != null
from subC in c.subClass
where subC != null
select subC.Name;
List<String> names = classNames.ToList();
这是一个LINQ查询,它相当于方法语法中的Enumerable.SelectMany
。
请注意,您需要添加using System.Linq
。