Довольно основная проблема для изменения. Учитывая класс, такой как это:
public class X
{
public T A;
public T B;
public T C;
...
// (other fields, properties, and methods are not of interest here)
}
Я ищу краткий способ кодирования метода, который будет возвращать все A
, B
, C
, ...
, которые не равны нулю в перечисляемой коллекции. (Предположим, что объявление этих полей как массива не вариант.)
public IEnumerable<T> GetAllNonNullABCs(this X x)
{
// ?
}
Очевидная реализация этого метода:
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;
}
Что меня особенно беспокоит, так это то, что код выглядит многословным и повторяющимся, и что я заранее не знаю начальную емкость List
.
Я надеюсь, что есть более умный способ, возможно, с участием оператора ??
? Есть идеи?
Примечание о выбранном ответе:
Я наконец выбрал комбинацию ответов Брайана Уоттса и dtb , что позволяет четко разделить определение набора свойств A
, B
, C
, ...
и фильтрация ненулевого подмножества:
(1) Определение набора включенных полей / свойств:
IEnumerable<T> AllABCs(this X x)
{
return new[] { x.A, x.B, x.C, ... };
}
Или альтернативно:
IEnumerable<T> AllABCs(this X x)
{
yield return x.A;
yield return x.B;
yield return x.C;
...
yield break;
}
(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!
}