Проблема заключается в том, что агент IoT предполагает, что устройство ответит JSON. Ответом по умолчанию на запрос является строка «ok». Это вызвало сбой в агенте.
Запрос считается успешным, если устройство возвращает {}
, и еще более успешным, если возвращает некоторую информацию о результате выполнения команды. Э.Г.
{
"ring": "successfully rung"
}
Короткий ответ
значение по умолчанию к использованию List<T>
почти во всех случаях.
Немного более длинный ответ
LinkedList<T>
только будет лучше, если Вы делаете большое добавление и удаление значений по сравнению с перечислением по тем значениям, и размер списка является большим. Это должно только быть фактором в Вашем выборе, последующий за профилированием при нахождении использования List<T>
проблема.
Более длинный ответ
Предположение, Вы определили использование одного или другого как являющегося проблемой для производительности.
Это Вы делаете большой произвольный доступ затем List<T>
почти всегда будет значительно быстрее несмотря ни на что. Если Вы перечисляете много и редко вставляете (или почти всегда вставляйте около/в конца), List<T>
почти всегда будет быстрее. Если Вы постоянно вставляете/удаляете в случайные местоположения, но в то время как итерация по списку так уже в или около соответствующего узла и будет иметь по крайней мере несколько тысяч элементов, которые можно хотеть попробовать LinkedList<T>
Разработка, что значения/использование переводят в лучшую производительность, очень зависит от Вашего профиля использования. Микросравнительные тесты могут быть очень вводящими в заблуждение здесь, так как они рисуют кистью под аспектами ковра поведения связанных списков как узлы в в том, чтобы быть распределенным о в памяти, а не приятно смежный, если они, оказывается, выделяются внезапно в Ваших тестах. Аналогично предварительное создание List<T>
с правильным размером может иметь большое значение.
Относительно стиля информатики, рассуждающего и большой нотации O (которым действительно нужен крупный N, чтобы быть значимыми в этом случае),
List<T>
LinkedList<T>
LinkedList<T>
реализация вдвойне связана),Использование памяти сложно, так как Список может иметь в большей части количества - 1 избыточная ячейка в любой точке, но LinkedList<T>
использует a LinkedListNode<T>
для каждой ячейки, которая является еще 3 ссылками (4/8 байта за поп) плюс обычный объект наверху. В нормальном использовании, вероятно, победит Список, но снова это должно только быть чем-то, что Вы волнуете по поводу того, если Вы находите, что потребление памяти является на самом деле проблемой.
Если Вы не имеете дело с крупной структурой, или Вы планируете итерацию по этой вещи триллион раз, она не имеет значения. Просто выберите один и начните кодировать. Если Ваше приложение замедляется к проверке позже, фигура почему затем и изменение по мере необходимости.
(Серьезно, это делает. нет. вопрос. В малейшем. Каждую минуту Вы тратите на нахождение, что ответ на этот вопрос является минутой ближе, Вы, возможно, были к наличию рабочего кода).
Если кто-либо перешел к сути дела, где они должны знать различие, LinkedList быстрее, чем Список и мог использоваться, если Вам только нужно неслучайный, передайте только чтение и добавление функциональности.
Я использовал бы List<T>
потому что все Ваши данные будут храниться последовательно, если они будут типами значения и все еще преуспеют со ссылочными типами (внутренне, List<T>
управляет массивом, который это выращивает фактором двух каждых раз, когда у Вас заканчивается пространство).
LinkedList<T>
используемый для создания намного большего смысла, когда вещами не был связанный IO. Люди будут часто заключать ее кажущееся в кавычки "O (1)" природа. Однако это обесценивает истинную стоимость, которая идет с увеличенными возможностями отсутствий страницы, получающих узлы.
Если можно получить непрерывные регионы памяти с массивом или List<T>
и избегайте потенциала отсутствия страницы, Вы очень более обеспечены с современными строками кэширования процессора и оперативной памяти.
Если Вы знаете, сколько элементов заранее Вы будете иметь, используйте массив. Если у Вас есть хорошая идея того, сколько элементов, используйте a List<T>
(и в конструкторе передают вероятную верхнюю границу для потенциального предотвращения перераспределения).
Единственное время я использовал бы a LinkedList<T>
то, если необходимо ударить объекты в списке одним значением постоянно. Например, если Вы реализуете последний использованный алгоритм кэширования и должны добавить что-то к передней стороне и взять что-то от конца.
Для мелочей это действительно не будет иметь значения. Сборщик "мусора" поколений будет уплотнять рассеянные объекты "кучи" вместе со временем, таким образом, связанный список не станет слишком плохим.
Я выбрал бы a List<T>
и выполненный с ним, если Вы не заметили проблем (через профилирование)
Если индексный доступ не требуется, Вы, вероятно, более обеспечены с a LinkedList<T>
. Нет большого различия, но LinkedList может быть быстрее для добавления.
Если Вы не имеете дело с сотнями тысяч или миллионами записей, и Вы представили свою программу, чтобы видеть, что существует основная проблема, Вы, вероятно, не заметите различия между двумя.
Кроме этого:
LinkedList<T>
обеспечивает отдельные узлы типаLinkedListNode<T>
, таким образом, вставка и удаление являются O (1) операции.
Учитывая Ваши требования для интерфейса, необходимо использовать ICollection<T>
везде в Вашем коде вместо того, чтобы относиться к конкретному реальному классу.
Причина - это, если Вы используете List
затем можно записать набор кода, который использует l[0]
получить первый объект. С другой стороны, если Вы используете LinkedList
затем Вы могли бы распространить вызовы к AddLast
всюду по Вашему коду. Для сохранения выбора переключиться необходимо постараться не становиться случайно зависящими от функций, в которых Вы действительно не нуждаетесь. Необходимо использовать интерфейс, который могут поддерживать оба контейнера.
Так запишите класс как это:
public static class Collections
{
public static ICollection<T> Make<T>()
{
return new List<T>();
}
}
Затем каждый раз, когда Вам нужен набор, сделайте это:
ICollection<int> c = Collections.Make<int>();
Изолируйте свой выбор контейнера от остальной части Вашей программы. Теперь, когда Вы представляете и передумали, просто необходимо отредактировать Make<T>
метод.
LinkedList будет нести больше памяти наверху (для узлов), но лучше при вставке многих элементов в середину. Связанный список потребует большего количества выделений памяти также, поскольку LinkedListNode является классом и выделяется динамично. Если бы Вы не вставляете элементы (просто добавляющий), я использовал бы Список. Список должен быть столь же быстрым или быстрее для добавления, хотя это должно будет иногда увеличиваться.
Если Ваш массив будет достаточно большим для имения значение, Вы должны к самокрутке... иначе просто использовать Список.