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)
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)