Как я могу получить первые n элементы из Словаря <строка, интервал>?

Одна из возможностей заключается в построении объединения на основе типа карты / объекта, так что невозможно добавить что-либо с конфликтующими ключами:

interface Item1 { key: 'key1'; value: string; }
interface Item2 { key: 'key2'; value: number; }
interface Item3 { key: 'key1'; value: Object; }

type UnionAsMap = {
    'key1': Item1,
    'key2': Item2
};
type Union = UnionAsMap[keyof UnionAsMap]; // Equivalent to Item1 | Item2

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

type UnionWithMatchingKeys = { [K in keyof UnionAsMap]: UnionAsMap[K] extends { key: K } ? UnionAsMap[K] : never };
type UnionHasMatchingKeys = Union extends UnionWithMatchingKeys[keyof UnionWithMatchingKeys] ? true : false;
let unionCheckSuccess: UnionHasMatchingKeys = true;

Так что если вы случайно сделали что-то подобное:

interface Item1 { key: 'key3'; value: string; }

UnionHasMatchingKeys закончится как ложное, и строка unionCheckSuccess будет отображать ошибку.

8
задан Uwe Keim 14 July 2019 в 19:15
поделиться

4 ответа

Note that there's no explicit ordering for a Dictionary, so although the following code will return n items, there's no guarantee as to how the framework will determine which n items to return.

using System.Linq;

yourDictionary.Take(n);

The above code returns an IEnumerable> containing n items. You can easily convert this to a Dictionary like so:

yourDictionary.Take(n).ToDictionary();
9
ответ дан 5 December 2019 в 04:46
поделиться

Словари не упорядочены как таковые , вы не можете полагаться на «первое», фактически означающее это. Из MSDN: «Для перечисления ... Порядок, в котором возвращаются элементы, не определен».

Вы можете использовать OrderedDictionary в зависимости от версии вашей платформы, и это не особенно сложно. вещь, создаваемая как пользовательский класс-потомок Dictionary.

17
ответ дан 5 December 2019 в 04:46
поделиться

Вы не можете взять первые N элементов из словаря , потому что это не упорядоченная коллекция. Так что в действительности он не имеет понятия «Первый», «Последний» и т. Д. Но, как уже отмечали другие, если вы просто хотите взять N элементов независимо от порядка, функция «LINQ take» работает нормально

var map = GetTheDictionary();
var firstFive = map.Take(5);
6
ответ дан 5 December 2019 в 04:46
поделиться

Could use Linq for example?

 var dictionary = new Dictionary<string, int>();

 /// Add items to dictionary

 foreach(var item in dictionary.Take(5))
 {
      // Do something with the first 5 pairs in the dictionary
 }
3
ответ дан 5 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

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