69

一般に、空のリストはNULLよりも好ましいことを知っています。しかし、主に 2 つの理由から、NULL を返します。

  1. バグや攻撃を避けて、null 値を明示的にチェックして処理する必要があります。
  2. ??後で戻り値を取得するための操作を実行するのは簡単です。

文字列の場合、IsNullOrEmpty があります。リストまたはIEnumerableに対して同じことを行うC#自体から何かがありますか?

4

10 に答える 10

77

フレームワークには何も組み込まれていませんが、非常に単純な拡張メソッドです。

こちらをご覧ください

/// <summary>
    /// Determines whether the collection is null or contains no elements.
    /// </summary>
    /// <typeparam name="T">The IEnumerable type.</typeparam>
    /// <param name="enumerable">The enumerable, which may be null or empty.</param>
    /// <returns>
    ///     <c>true</c> if the IEnumerable is null or empty; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNullOrEmpty<T>(this IEnumerable<T> enumerable)
    {
        if (enumerable == null)
        {
            return true;
        }
        /* If this is a list, use the Count property for efficiency. 
         * The Count property is O(1) while IEnumerable.Count() is O(N). */
        var collection = enumerable as ICollection<T>;
        if (collection != null)
        {
            return collection.Count < 1;
        }
        return !enumerable.Any(); 
    }

Daniel Vaughan は、パフォーマンス上の理由から、(可能な場合) ICollection にキャストするという追加の手順を実行します。私がやろうとは思わなかった何か。

于 2011-12-20T21:45:04.170 に答える
25

何も組み込まれていません。

ただし、これは単純な拡張メソッドです。

public static bool IsNullOrEmpty<T>(this IEnumerable<T> enumerable)
{
  if(enumerable == null)
    return true;

  return !enumerable.Any();
}
于 2011-12-20T21:43:52.333 に答える
10
var nullOrEmpty = list == null || !list.Any();
于 2011-12-20T21:46:23.203 に答える
1

空でない場合にすべての要素を取得できるようにする必要がある場合、Any()巻き戻し不可能な列挙型の呼び出しは要素を「忘れる」ため、ここでの回答の一部は機能しません。

別のアプローチを取り、nullを空に変えることができます。

bool didSomething = false;
foreach(var element in someEnumeration ?? Enumerable.Empty<MyType>())
{
  //some sensible thing to do on element...
  didSomething = true;
}
if(!didSomething)
{
  //handle the fact that it was null or empty (without caring which).
}

同様に(someEnumeration ?? Enumerable.Empty<MyType>()).ToList()等を使用することができます。

于 2011-12-20T23:39:08.430 に答える
1

他の誰もが言ったように、フレームワークには何も組み込まれていませんが、Castle を使用している場合、Castle.Core.Internal にはそれがあります。

using Castle.Core.Internal;

namespace PhoneNumbers
{
    public class PhoneNumberService : IPhoneNumberService
    {
        public void ConsolidateNumbers(Account accountRequest)
        {
            if (accountRequest.Addresses.IsNullOrEmpty()) // Addresses is List<T>
            {
                return;
            }
            ...
于 2014-03-19T11:12:52.930 に答える
0
var nullOrEmpty = !( list?.Count > 0 );
于 2016-09-27T11:43:25.617 に答える