我喜欢绳子。IsNullOrEmpty方法。我想有一些东西,将允许相同的功能IEnumerable。有这样的东西吗?也许是一些收集助手类?我问的原因是,在if语句中,如果模式是(mylist != null && mylist. any()),代码看起来很混乱。使用Foo.IsAny(myList)会干净得多。

这篇文章没有给出答案:IEnumerable是空的?


当前回答

没有自定义助手,我也推荐?.Any() ??. any () == true相对简洁,只需要指定一次序列。


当我想要像对待空集合一样对待一个缺失的集合时,我使用以下扩展方法:

public static IEnumerable<T> OrEmpty<T>(this IEnumerable<T> sequence)
{
    return sequence ?? Enumerable.Empty<T>();
}

这个函数可以与所有LINQ方法和foreach组合,而不仅仅是. any(),这就是为什么我更喜欢它而不是人们在这里提出的更专业的帮助函数。

其他回答

下面是Marc Gravell回答的代码,以及使用它的示例。

using System;
using System.Collections.Generic;
using System.Linq;

public static class Utils
{
    public static bool IsAny<T>(this IEnumerable<T> data)
    {
        return data != null && data.Any();
    }
}

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<string> items;
        //items = null;
        //items = new String[0];
        items = new String[] { "foo", "bar", "baz" };

        /*** Example Starts Here ***/
        if (items.IsAny())
        {
            foreach (var item in items)
            {
                Console.WriteLine(item);
            }
        }
        else
        {
            Console.WriteLine("No items.");
        }
    }
}

正如他所说,并不是所有序列都是可重复的,因此代码有时可能会引起问题,因为IsAny()开始遍历序列。我怀疑Robert Harvey的回答的意思是,您通常不需要检查null和empty。通常,您可以只检查null,然后使用foreach。

为了避免两次启动序列并利用foreach,我只写了一些像这样的代码:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<string> items;
        //items = null;
        //items = new String[0];
        items = new String[] { "foo", "bar", "baz" };

        /*** Example Starts Here ***/
        bool isEmpty = true;
        if (items != null)
        {
            foreach (var item in items)
            {
                isEmpty = false;
                Console.WriteLine(item);
            }
        }
        if (isEmpty)
        {
            Console.WriteLine("No items.");
        }
    }
}

我猜扩展方法为您节省了几行输入,但这段代码对我来说似乎更清楚。我怀疑一些开发人员不会立即意识到IsAny(项目)实际上将开始在序列中进行步进。(当然,如果你使用了很多序列,你很快就会学会思考通过它们的步骤。)

我使用Bool IsCollectionNullOrEmpty = !(Collection?. any ()??false);。希望这能有所帮助。

分解:

. any()如果Collection为空将返回null,如果Collection为空则返回false。

收集? .Any () ?如果Collection为空,则返回false;如果Collection为空,则返回false。

它的补将得到IsEmptyOrNull。

当然你可以这样写:

public static class Utils {
    public static bool IsAny<T>(this IEnumerable<T> data) {
        return data != null && data.Any();
    }
}

但是,要注意不是所有序列都是可重复的;一般来说,我宁愿只遛一次,以防万一。

只需添加使用系统。Linq和看到魔术发生时,你试图访问可用的方法在IEnumerable。添加它将使您能够访问名为Count()的方法,就像这样简单。只要记住在调用count():)之前检查空值即可。

我根据@Matt Greer的回答构建了这个

他完美地回答了那位警官的问题。

我想要这样的东西,同时保持Any的原始功能,同时还检查null。我张贴这个以防其他人需要类似的东西。

具体来说,我希望仍然能够传递一个谓词。

public static class Utilities
{
    /// <summary>
    /// Determines whether a sequence has a value and contains any elements.
    /// </summary>
    /// <typeparam name="TSource">The type of the elements of source.</typeparam>
    /// <param name="source">The <see cref="System.Collections.Generic.IEnumerable"/> to check for emptiness.</param>
    /// <returns>true if the source sequence is not null and contains any elements; otherwise, false.</returns>
    public static bool AnyNotNull<TSource>(this IEnumerable<TSource> source)
    {
        return source?.Any() == true;
    }

    /// <summary>
    /// Determines whether a sequence has a value and any element of a sequence satisfies a condition.
    /// </summary>
    /// <typeparam name="TSource">The type of the elements of source.</typeparam>
    /// <param name="source">An <see cref="System.Collections.Generic.IEnumerable"/> whose elements to apply the predicate to.</param>
    /// <param name="predicate">A function to test each element for a condition.</param>
    /// <returns>true if the source sequence is not null and any elements in the source sequence pass the test in the specified predicate; otherwise, false.</returns>
    public static bool AnyNotNull<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
        return source?.Any(predicate) == true;
    }
}

扩展方法的命名可能会更好。