Одна из возможностей заключается в построении объединения на основе типа карты / объекта, так что невозможно добавить что-либо с конфликтующими ключами:
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
будет отображать ошибку.
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();
Словари не упорядочены как таковые , вы не можете полагаться на «первое», фактически означающее это. Из MSDN: «Для перечисления ... Порядок, в котором возвращаются элементы, не определен».
Вы можете использовать OrderedDictionary в зависимости от версии вашей платформы, и это не особенно сложно. вещь, создаваемая как пользовательский класс-потомок Dictionary.
Вы не можете взять первые N элементов из словаря
, потому что это не упорядоченная коллекция. Так что в действительности он не имеет понятия «Первый», «Последний» и т. Д. Но, как уже отмечали другие, если вы просто хотите взять N элементов независимо от порядка, функция «LINQ take» работает нормально
var map = GetTheDictionary();
var firstFive = map.Take(5);
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
}