如何为列表创建扩展方法以在列表为空时返回null或返回完整列表

时间:2018-11-05 01:14:29

标签: c#

我有多个不同对象的列表。 对于所有对象,如果它是一个空列表,我想返回null或返回完整列表。 我该如何实现? 我想做类似的事情

address = person.addresses.tolist().count > 0 ? person.addresses.tolist : null;
aliases = person.aliases.tolist().count > 0 ? person.aliases.toList() : null;
trackingCodes = person.trackingCodes .tolist().count > 0 ? person.trackingCodes .toList() : null;

在上面的代码行中,我两次计算地址列表。

我想知道我是否可以创建一个扩展方法以用作 address = patient.addresses.tolist().GetListOrNull() 并且GetListOrNull()方法返回list或null值。 这可能吗?

2 个答案:

答案 0 :(得分:0)

扩展方法必须在静态类中,并且必须是静态的。

您可以这样写:

public static class EnumerableExtensions
{
    public static IList<T> GetListOrNull<T>(this IEnumerable<T> items)
    {
        if (items == null)
        {
            return null;
        }

        // optimization to avoid creating a new list when the input already implements `IList`
        if (!(items is IList<T> tmp))
        {
            tmp = items.ToList();
        }
        return tmp.Any() ? tmp : null;
    }

    // or a list-specific version
    public static IList<T> GetListOrNull<T>(this IList<T> items)
    {
        if (items == null)
        {
            return null;
        }

        return items.Any() ? items : null;
    }
}

答案 1 :(得分:-1)

这是一个可在IEnumerable上使用的版本,因此它可以更通用一些。 我认为.Any()比.Count> 0

更为简洁
public static class MyExtentions 
{
    public static IEnumerable<T> ToNullIfEmpty<T>(this IEnumerable<T> container) 
    {
        if(container == null || !container.Any())
            return null;
        else
            return container;            
    }
}