用于将具有非null值的多个属性收集到集合中的简明C#代码?

sta*_*ica 2 c# collections nullable properties

变化的一个相当基本的问题.鉴于此类:

public class X
{
    public T A;
    public T B;
    public T C;
    ...

    // (other fields, properties, and methods are not of interest here)
}
Run Code Online (Sandbox Code Playgroud)

我要寻找一个简洁的方式来编码,将返回所有的方法A,B,C,...这不是一个枚举集合空.(假设将这些字段声明为数组不是一种选择.)

public IEnumerable<T> GetAllNonNullABCs(this X x)
{
    // ?
}
Run Code Online (Sandbox Code Playgroud)

这种方法的明显实现是:

public IEnumerable<T> GetAllNonNullABCs(this X x)
{
    var resultSet = new List<T>();

    if (x.A != null) resultSet.Add(x.A);
    if (x.B != null) resultSet.Add(x.B);
    if (x.C != null) resultSet.Add(x.C);
    ...

    return resultSet;
}
Run Code Online (Sandbox Code Playgroud)

特别困扰我的是代码看起来冗长而重复,而且我List事先并不知道初始容量.

我希望有一种更聪明的方式,可能涉及??运营商的事情?有任何想法吗?


关于所选答案的注意事项:

我终于走到了这两者的混合布莱恩瓦DTB的答案,它允许定义一组属性明显分离A,B,C,...和非空子集的过滤:

(1)包含的字段/属性集的定义:

IEnumerable<T> AllABCs(this X x)
{
    return new[] { x.A, x.B, x.C, ... };
}
Run Code Online (Sandbox Code Playgroud)

或者:

IEnumerable<T> AllABCs(this X x)
{
    yield return x.A;
    yield return x.B;
    yield return x.C;
    ...
    yield break;
}
Run Code Online (Sandbox Code Playgroud)

(2)仅返回非空值:

IEnumerable<T> ThatAreNotNull(this IEnumerable<T> enumerable)
{
    return enumerable.Where(item => item != null);
}

IEnumerable<T> AllNonNullABCs(this X x)
{
    return AllABCs().ThatAreNotNull();
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^
    //     goal reached; it won't get shorter and clearer than this, IMO!
}
Run Code Online (Sandbox Code Playgroud)

Bry*_*tts 7

public static IEnumerable<T> GetAllNonNullAs(this X x)
{
    return new[] { x.A, x.B, x.C }.Where(t => t != null);
}
Run Code Online (Sandbox Code Playgroud)