Список коллекции, где дело слишком медленно для 30000 предметов - PullRequest
0 голосов

Я использую коллекцию списков, в которой хранятся два элемента ID и штрих-код. Список содержит около 30000 строк.

При использовании приведенный ниже код занимает около 600 мс. Есть ли способ сделать это немного быстрее?

var InventoryItemID = mBarcode.Where(x => (x.Barcode == Barcode.Text))
                              .Select(x => x.InventoryItemID)
                              .First();

1 Ответ

5 голосов
/ 22 марта 2020

Попробуйте Dictionary<K,V>, набрав Barcode с InventoryItems в качестве значений.

Я не могу видеть ваши классы, чтобы быть точным, но что-то вроде этого:

class Barcode
{
    public string BarcodeText { get; set; }
    public int InventoryItemId { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // Create some  barcodes
        Barcode bc1 = new Barcode { BarcodeText = "AAA", InventoryItemId = 123 };
        Barcode bc2 = new Barcode { BarcodeText = "BBB", InventoryItemId = 456 };
        Barcode bc3 = new Barcode { BarcodeText = "CCC", InventoryItemId = 789 };

        Dictionary<string, Barcode> dict = new Dictionary<string, Barcode>();

        // Add to dictionary, keying on the barcode's text
        dict.Add(bc1.BarcodeText, bc1);
        dict.Add(bc2.BarcodeText, bc2);
        dict.Add(bc3.BarcodeText, bc3);

        // Lookup on the barcode text and get the required property
        Console.WriteLine(dict["BBB"].InventoryItemId);
    }
}

Для больших чисел это будет быстрее, потому что поиск в Списке линейный, поэтому среднее время поиска пропорционально количеству элементов (N).

Словарь выполняет секционированный поиск по значению ключа ha sh и пропорционален двоичному логарифму N.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...