2

我有以下 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.Namenames List<string>对象中?

myObject.myClass可以为空。

4

5 回答 5

4

听起来你可以使用:

List<string> names = myObject.myClass == null
    ? new List<string>()
    : myObject.myClass.subclass.Select(x => x.Name).ToList();

请注意,此表达式:myObject.myClass.subclass表明您相当讨厌地违反了得墨忒耳法则-我希望命名实际上并不能反映现实……如果您可以提供一组更具指示性的表达式,那将有很大帮助。

于 2012-09-28T10:14:48.330 回答
4

您可以使用该AddRange方法将 an 的所有元素添加IEnumerable到列表中:

if (myObject.myClass != null) {
    names.AddRange(myObject.myClass.subClass.Select(c => c.Name));
}
于 2012-09-28T10:15:02.043 回答
1

您可以在 List 上使用AddRange方法。

于 2012-09-28T10:14:58.703 回答
0

您可以使用 LINQ 构建列表,但请注意,它仍在枚举以构建列表:

var names = myObject.myClass.subClass.Select(x => x.Name).ToList();
于 2012-09-28T10:15:01.953 回答
0

目前尚不清楚什么是集合,什么不是。所以我假设这myObject.myClass已经是一个集合(IEnumerable<myClass>)并且可以为空并且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.SelectManyin 方法语法。

请注意,您需要添加using System.Linq.

于 2012-09-28T10:16:29.160 回答