Как выполнить поиск по списку пользовательских структур (C#), содержащему строку и байт?

#c# #list #byte

Вопрос:

Я пытаюсь выполнить поиск по списку, содержащему структуру:

 struct Item
{
    public string Name;
    public Byte[] Data;
}
static List<Item> Items = new List<item>();
 

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

Кроме того, база данных слишком медленная для этого — это должно происходить в памяти (список не должен превышать 1 МБ).

Спасибо

Комментарии:

1. Было бы приемлемо использовать a Dictionary<string, Byte[]> вместо списка struct ? Тогда поиски были бы O(1) .

2. Если удалено следующим образом: Словарь<строка, байт[]> Элементы = новый словарь<строка, байт[]><строка, байт[]>(); можно ли обновлять такие элементы? Элементы[«уникальный код»] = новые байты; ?

3. Да, это верно. Если ключ не существует, создается новая запись с указанным значением, и если ключ уже существует, существующее значение обновляется новым. Это очень быстро.

4. Проверено — отлично!

Ответ №1:

Пошел со словарем, как предложил Мэтью Уотсон в первом ответе.

 static Dictionary<string, Byte[]> Items = new Dictionary<string, Byte[]>();
 

И обновление списка с помощью

 Items[currentItem] = GetByteFromData(data);
//and
Items.Remove(currentItem);
 

Спасибо всем

Ответ №2:

Линк?

var targetItem = предметы.Сначала ( x => x.Name == Целевое значение);

Хотя не уверен, что это быстрее, чем foreach. Может быть интересно, что, если только это не изменилось в последнее время, циклы for работают быстрее, чем циклы foreach.

Комментарии:

1. Здесь следует выбрать значение FirstOrDefault в случае отсутствия значения targetValue. В любом случае foreach просто скрыт и выполняется внутри кода Linq. Для выступлений лучше сменить хранилище на словарь

2. Да, словарь лучше — я написал это до того, как увидел это предложение.