天天看點

.NET6新東西---TryGetNonEnumeratedCount

在.NET6中微軟新增了 TryGetNonEnumeratedCount 方法,讓我們可以計算可枚舉類型元素的總數。到這裡一定有讀者會問:LINQ中已經包含了Count方法,為什麼還要增加TryGetNonEnumeratedCount方法呢?要解決這個問題,我們先來看一段代碼:

var u = new User<int>();
Console.WriteLine($@"{u.Count()}");
var e = new Employee<int>();
Console.WriteLine($@"{e.Count()}");
class User<T> : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

class Employee<T> : User<T>, ICollection
{
    public int Count => 123456;

    public bool IsSynchronized => throw new NotImplementedException();

    public object SyncRoot => throw new NotImplementedException();

    public void CopyTo(Array array, int index)
    {
        throw new NotImplementedException();
    }
}           

複制

運作上面的代碼會發現e.Count()能夠執行,但是u.Count()報錯,這是LINQ内部實作造成的。某些集合類型如果無法通過Count屬性/方法确定集合元素數量的話,會嚴重影響程式性能,這是因為Count屬性/方法必須枚舉整個集合來确定元素數量,例如EF Core中使用IQueryable.Count()方法需要通路資料庫擷取全部記錄才能計算總數。為了解決這個問題我們就需要使用TryGetNonEnumeratedCount方法,如果可以快速計數,該方法将傳回true并将計數作為out變量傳回。是以建議在代碼中始終使用如下方式擷取可枚舉類型的元素總數:

if (!enumerable.TryGetNonEnumeratedCount(out var count))
{
    //more code
}           

複制