Если вы просматриваете коллекцию целиком, обход всего списка, скорее всего, даст лучшую производительность, чем обход всего набора, потому что элементы списка расположены в памяти (при условии, что вы используете List<T>
, а не связанный список).
Если вы выполняете тысячи таких запросов для одних и тех же данных в myList
, вы можете повысить производительность, построив три справочные таблицы - для x.A
, x.B
и для общего значения, когда x.A == x.B
:
var countByA = myList
.GroupBy(x => x.A)
.ToDictionary(g => g.Key, g => g.Count());
var countByB = myList
.GroupBy(x => x.B)
.ToDictionary(g => g.Key, g => g.Count());
var countByAandB = myList
.Where(x => x.A == x.B)
.GroupBy(x => x.A)
.ToDictionary(g => g.Key, g => g.Count());
Теперь ваш запрос может быть преобразован в три просмотра с использованием принципа включения-исключения :
countByA.TryGetValue(myValue, out var counterA);
countByB.TryGetValue(myValue, out var counterB);
countByAandB.TryGetValue(myValue, out var counterAandB);
int counter = counterA + counterB - counterAandB;