现在我的代码看起来是这样的:
var ids = projectId.HasValue ? new List<Guid> { projectId.Value } : new List<Guid>();
是否有更简洁的方法在一行代码中创建一个列表,并可选地添加一个元素?
现在我的代码看起来是这样的:
var ids = projectId.HasValue ? new List<Guid> { projectId.Value } : new List<Guid>();
是否有更简洁的方法在一行代码中创建一个列表,并可选地添加一个元素?
public static void AddIfNotNull<T>(this List<T> list, T? value) where T : struct
{
if(value != null)
{
list.Add(value.Value);
}
}
那么它可以像这样使用:
var ids = new List<Guid>();
ids.AddIfNotNull(projectId);
var ids = new List<Guid>().AddIfNotNull(projectId);
T
是Guid
,但projectId
是Guid?
。如果你要创建一个扩展方法,最好实现期望的行为,即函数T? -> List<T>
。 - Lee另一个扩展方法的想法(名称肯定可以改进,也许是PossiblyCreateSingletonList
?):
public static class NullableExtensions
{
public static List<T> SingletonList<T>(this Nullable<T> item) where T : struct
{
return item.HasValue ? new List<T> { item.Value } : new List<T>();
}
}
使用方法:
Guid? projectId = null;
List<Guid> projectIds = projectId.SingletonList(); // empty list
这很简洁,但另一种选择是使用LINQ:
var ids = new[] { projectId }.Where(x => x.HasValue).Select(x => x.Value).ToList();
Add()
作为扩展方法的情况。Add()
方法:public static void Add<T>(this List<T> list, T? item) where T : struct
{
if (item.HasValue)
{
list.Add(item.Value);
}
}
var list = new List<Guid> { projectId };
T
/T?
的区别),并且没有简单的方法使其适用于引用类型。public static void AddIfNotNull<T>(this List<T> list, T? value)
where T : struct
{
if (value.HasValue)
{
list.Add(value.Value);
}
}
如果需要,您必须为引用类型(where T : class
)构建第二个扩展方法。