Cause
The Count or Length property or the System.Linq.Enumerable.Count%28System.Collections.Generic.IEnumerable%7B%7D%29 extension method was used to determine whether or not the object contains any items by comparing the value to 0 or 1, and the object has a more efficient IsEmpty property that could be used instead.
Rule description
This rule flags the calls to the Count and Length properties or System.Linq.Enumerable.Count%28System.Collections.Generic.IEnumerable%7B%7D%29 and System.Linq.Enumerable.LongCount%28System.Collections.Generic.IEnumerable%7B%7D%29 LINQ methods when they are used to determine if the object contains any items and the object has a more efficient IsEmpty property.
The analysis of this rule originally overlapped with similar rules CA1827, CA1828, and CA1829; the analyzers of such rules were merged along with the one for CA1836 to report the best diagnosis in case of overlap.
How to fix violations
To fix a violation, replace the System.Linq.Enumerable.Count%28System.Collections.Generic.IEnumerable%7B%7D%29 or System.Linq.Enumerable.LongCount%28System.Collections.Generic.IEnumerable%7B%7D%29 method call or the Length or Count property access when it's used in an operation that determines if the object is empty with use of the IsEmpty property access. For example, the following two code snippets show a violation of the rule and how to fix it:
using System.Collections.Concurrent;
class C
{
ConcurrentQueue<int> _queue;
public bool IsEmpty => _queue.Count == 0;
}using System.Collections.Concurrent;
class C
{
ConcurrentQueue<int> _queue;
public bool IsEmpty => _queue.IsEmpty;
}When to suppress warnings
It's safe to suppress a violation of this rule if you're not concerned about the performance impact from unnecessary item enumeration to compute the count.
Suppress a warning
If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.
#pragma warning disable CA1836
// The code that's violating the rule is on this line.
#pragma warning restore CA1836To disable the rule for a file, folder, or project, set its severity to none in the configuration file.
[*.{cs,vb}]
dotnet_diagnostic.CA1836.severity = noneFor more information, see How to suppress code analysis warnings.
Related rules
- CA1827: Do not use Count/LongCount when Any can be used
- CA1828: Do not use CountAsync/LongCountAsync when AnyAsync can be used
- CA1829: Use Length/Count property instead of Enumerable.Count method