LINQ之All

返回LINQ大全首頁

All()

使用All()可以判斷序列中的所有元素(例如數組或列表)是否滿足指定條件。
MSDN

public static bool All<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate );

以下代碼使用一個lambda表達式來描述要檢查的條件。

代碼示例:

public static class Program
{
    static void Main( string[] args )
    {
        int[]   numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        bool reaultA = numbers.All( value => value % 2 == 0 );
        bool reaultB = numbers.All( value => value < 10 );
        bool reaultC = numbers.All( value => value >= 5 );

        System.Console.WriteLine( "輸出:{0}", numbers.Text() );
        System.Console.WriteLine( "全是偶數  :{0}", reaultA );
        System.Console.WriteLine( "小於10:{0}", reaultB );
        System.Console.WriteLine( "大於等於5 :{0}", reaultC );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
}

輸出:[0], [1], [2], [3], [4], [5], [6], [7], [8], [9],
全是偶數 :False
小於10:True
大於等於5 :False

那麼在空的數組中使用All()會發生什麼呢?讓我們嘗試一下。

代碼示例:

public static class Program
{
    static void Main( string[] args )
    {
        int[]   numbers = new int[] {};
        
        bool reaultA = numbers.All( value => value % 2 == 0 );
        bool reaultB = numbers.All( value => value < 10 );
        bool reaultC = numbers.All( value => value >= 5 );

        System.Console.WriteLine( "輸出:{0}", numbers.Text() );
        System.Console.WriteLine( "全是偶數  :{0}", reaultA );
        System.Console.WriteLine( "小於等於10:{0}", reaultB );
        System.Console.WriteLine( "大於等於5 :{0}", reaultC );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

輸出:
全是偶數 :True
小於等於10:True
大於等於5 :True

由此可知,在序列爲空時所有條件都會返回true
爲什麼爲空數組時返回True?讓我們做更多的研究。
在下面的類中,GetNumber()函數會在調用時輸出日誌,讓我們進一步瞭解All()

代碼示例:

public static class Program
{
    private class Parameter
    {
        public int      ID      { get; set; }
        public string   Name    { get; set; }

        public int GetNumber()
        {
            System.Console.WriteLine( "我{0} 數值爲{1} ", Name, ID );
            return ID;
        }

        public override string ToString()
        {
            return string.Format( "ID:{0}, Name:{1}", ID, Name );
        }
    }

    static void Main( string[] args )
    {
        Parameter[] parameters = new Parameter[]
        {
            new Parameter() { ID = 1, Name = "正一郎" },
            new Parameter() { ID = 2, Name = "清次郎" },
            new Parameter() { ID = 3, Name = "誠三郎" },
            new Parameter() { ID = 4, Name = "徵史郎" },
        };

        // 全部小於10
        bool reault = parameters.All( value => value.GetNumber() < 10 );

        System.Console.WriteLine( "輸出:{0}", parameters.Text() );
        System.Console.WriteLine( "全部小於10:{0}", reault );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

我正一郎數值爲1
我清次郎數值爲2
我誠三郎數值爲3
我徵史郎數值爲4
輸出:[ID:1, Name:正一郎], [ID:2, Name:清次郎], [ID:3, Name:誠三郎], [ID:4, Nam
e:徵史郎],
全部小於10::True

如果所有元素都滿足條件,則可以看到每個元素都調用了GetNumber()
那麼,如果所有元素不符合條件的話將是什麼樣的結果呢?

代碼示例:

public static class Program
{
    private class Parameter
    {
        public int      ID      { get; set; }
        public string   Name    { get; set; }

        public int GetNumber()
        {
            System.Console.WriteLine( "我{0}數值爲{1}", Name, ID );
            return ID;
        }

        public override string ToString()
        {
            return string.Format( "ID:{0}, Name:{1}", ID, Name );
        }
    }

    static void Main( string[] args )
    {
        Parameter[] parameters = new Parameter[]
        {
            new Parameter() { ID = 1, Name = "正一郎" },
            new Parameter() { ID = 2, Name = "清次郎" },
            new Parameter() { ID = 3, Name = "誠三郎" },
            new Parameter() { ID = 4, Name = "徵史郎" },
        };

        bool reault = parameters.All( value => value.GetNumber() < 3 );

        System.Console.WriteLine( "輸出:{0}", parameters.Text() );
        System.Console.WriteLine( "全小於3:{0}", reault );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

我正一郎數值爲1
我清次郎數值爲2
我誠三郎數值爲3
輸出:[ID:1, Name:正一郎], [ID:2, Name:清次郎], [ID:3, Name:誠三郎], [ID:4, Nam
e:徵史郎],
全小於3:False

可以發現徵史郎的元素沒有被調用。
如果存在不符合條件的要素,則執行將會被終止。
但是,這似乎跟空數組返回true並沒有直接關係。
那麼,true是否以空數組形式返回?經過搜索並沒有找到相關的的官方資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章