HashSet сохраняет порядок вставки?

Вы должны сообщить TypeScript, какова связь между внутренним элементом и вашим пользовательским реквизитом.

interface OverriddenProps extends JSX.IntrinsicElements {
  a: AnchorProps;
  p: ParagraphProps;
}

Создайте свой Overrides сопоставленный тип:

type Overrides = {
  [Tag in keyof JSX.IntrinsicElements]?: {
    component: React.ComponentType<OverriddenProps[Tag]>;
    props: OverriddenProps[Tag]
  }
}

Вывод типа теперь будет работать правильно.

62
задан Colonel Panic 26 April 2016 в 15:29
поделиться

4 ответа

страница This HashSet MSDN конкретно говорит:

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

70
ответ дан Michael Burr 24 November 2019 в 16:44
поделиться

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

РЕДАКТИРОВАНИЕ: вот контрпример:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        var set = new HashSet<int>();

        set.Add(1);
        set.Add(2);
        set.Add(3);
        set.Remove(2);
        set.Add(4);


        foreach (int x in set)
        {
            Console.WriteLine(x);
        }
    }
}

Это печатает 1, 4, 3 несмотря на 3 вставленный прежде 4.

Это возможно , что, если Вы никогда не удаляете объектов, это сохранит порядок вставки. Я не уверен, но я не был бы полностью удивлен. Однако я думаю, что это была бы очень плохая идея полагаться на это:

  • Это не документируется для прокладывания себе путь, и документация явно указывает, что это не отсортировано.
  • я не посмотрел на внутренние структуры или исходный код (который я не имею, очевидно) - я должен был бы изучить их тщательно прежде, чем предъявить любую такую претензию твердым способом.
  • реализация могла очень легко измениться между версиями платформы. Доверие этому было бы похоже на доверие string.GetHashCode реализация, не изменяющаяся - который некоторые люди действительно поддерживали в.NET 1,1 дня, и затем они были записаны, когда реализация сделала изменение в.NET 2.0...
40
ответ дан Jon Skeet 24 November 2019 в 16:44
поделиться

Состояния документации:

А HashSet< (< (T>)>) набор не отсортирован и не может содержать дублирующиеся элементы. Если дублирование порядка или элемента более важно, чем производительность для Вашего приложения, рассмотрите использование List< (< (T>)>) класс вместе с Методом сортировки.

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

необходимо программировать против зарегистрированные контракты , не детали реализации .

7
ответ дан Greg Beech 24 November 2019 в 16:44
поделиться

Нет, набор хеша не сохранит порядок вставки, по крайней мере, не очевидно. Вы могли использовать LinkedHashSet (Java) или эквивалент. LinkedHashSet сохранит порядок.

<забастовка>, Если Вы хотите порядок, Вы не должны даже использовать набор во-первых ... не сделанный для заказанных элементов, кроме исключительных случаев.

РЕДАКТИРОВАНИЕ: кажется, что я проповедую:-/Извините.

2
ответ дан Sudhir Jonathan 24 November 2019 в 16:44
поделиться
Другие вопросы по тегам:

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