Является словарем <TKey, TValue> быстрее, чем LINQ в Списке <T>?

Я обычно использую List<T> для наборов. Но если бы мне нужен быстрый поиск на наборе, затем например, в следующем примере я использовал бы Словарь, таким образом, я мог искать его быстро id:

Dictionary<int, Customer>

Но так как я могу использовать LINQ для запросов List<T> так или иначе, как ниже, там какая-либо причина состоит в том, чтобы пройти проблему использовать Словарь вместо Списка? Словарь быстрее, или LINQ делает что-то негласно, которое делает его столь же быстро?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Customer> customers = new List<Customer>()
            {
             new Customer { Id = 234, FirstName = "Jim", LastName = "Smith" },
             new Customer { Id = 345, FirstName = "John", LastName = "Thomas" },
             new Customer { Id = 654, FirstName = "Rick", LastName = "Ashton" },
             new Customer { Id = 948, FirstName = "Rod", LastName = "Anders" }
            };

            var customer = (from c in customers
                           where c.Id == 654 select c).SingleOrDefault();
            Console.WriteLine(customer.Display());

            Console.ReadLine();

        }
    }


    public class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        internal string Display()
        {
            return String.Format("{0}, {1} ({2})", LastName, FirstName, Id);
        }

    }
}
15
задан Edward Tanguay 10 August 2010 в 10:57
поделиться

6 ответов

Если вы логически хотите создать коллекцию, в которой можно легко найти клиента по его ID, я бы использовал некоторую форму IDictionary. Это выражает то, чего вы пытаетесь достичь.

Теперь вы можете использовать список, чтобы сделать то же самое, и, как говорит Леппи, для небольших наборов данных это будет примерно так же быстро или даже быстрее - но для небольших наборов данных это все равно будет очень быстро, так почему вас это волнует? Я думаю, важнее сообщить читателю вашего кода, что вы пытаетесь сделать с коллекцией - и словарь достигает этой цели гораздо эффективнее, чем список, IMO.

25
ответ дан 1 December 2019 в 01:16
поделиться

Для списков меньше 20 элементов, накладные расходы Dictionary/Hashtable приведут к тому, что он будет работать медленнее, чем список.

3
ответ дан 1 December 2019 в 01:16
поделиться

LINQ обычно работает медленнее при выполнении такого рода операций. Однако на достаточно маленьком наборе (например, в вашем примере) это, вероятно, будет быстрее из-за различий в накладных расходах. Однако опять же, на достаточно небольшом наборе (например, в вашем примере) разница между любым решением будет настолько мала, что это не будет иметь такого же значения, как вопрос о том, поиск по словарю или Where () читается более естественно.

1
ответ дан 1 December 2019 в 01:16
поделиться

Возможно, вы могли бы использовать SortedList и выполнить двоичный поиск (учитывая, что он удаляет половину коллекции после первого сравнения) на этой коллекции.

0
ответ дан 1 December 2019 в 01:16
поделиться

LINQ - это не волшебство. Ему все равно придется перебирать список, чтобы найти нужный элемент. Словарь по-прежнему будет работать быстрее (для коллекций подходящего размера, как указывает Леппи)

4
ответ дан 1 December 2019 в 01:16
поделиться

Согласно MSDN получение элемента из словаря на основе ключа «приближается к операции O (1)». С другой стороны, выполнение Where в списке просматривает элементы в поисках совпадений. Так что в целом словарь определенно будет быстрее.

Если вы хотите ускорить операции Linq, вы можете использовать Индексированный LINQ , который позволяет помещать индексы в ваши коллекции.

4
ответ дан 1 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: