Фактически, в текущей реализации MS Count (IEnumerable) есть ярлык, который проверяет, является ли IEnumerable ICollection и вызывает для него Count. Так что производительность при подсчете элементов должна быть сопоставимой.
ToList и ToArray немного похожи. Если IEnumerable - это ICollection, то вместо этого вызывается метод CopyTo, что немного быстрее.
Итак, выберите, что делает ваш код наиболее читаемым, и сравните тест для ВАШЕГО варианта использования, чтобы получить определенный ответ.
Обновить: Я провел наивный тест.
Начиная с массива: var items = Enumerable.Range (1,1000) .ToArray ();
Начиная с IEnumerable: var items = Enumerable.Range (1,1000);
Таким образом, вы получаете сопоставимую производительность.
Разница, вероятно, настолько мала, что стоит просто использовать метод, который лучше соответствует вашим потребностям. Пахнет микрооптимизацией.
И в этом случае, поскольку все, что вы делаете, это перечисляет набор и подсчитывает набор (и то, и другое вы можете сделать с IEnumerable), почему бы просто не оставить его как IEnumerable <>?
Если вы действительно беспокоитесь о производительности, вам следует перебрать IEnumerable
и считать его по ходу. Это позволяет избежать создания новой коллекции в целом, а пересечение нужно повторить только один раз:
void Foobar(string[] arr, Dictionary<string, string[]>)
{
var t = arr.Intersect(dic.Keys);
int count = 0;
foreach(var item in t)
{
count++;
..
}
var j = count;
}
Но, как кто-то сказал: это пахнет микрооптимизацией. Если производительность действительно имеет значение в этой ситуации, по крайней мере выполните профилирование производительности, чтобы выяснить, какой метод действительно самый быстрый для вас.