c# Как сделать select key - field?

Есть модель данных:

public class Item1
{
    public long Addr { get; set; }
    public long Pos { get; set; }
    public string Description { get; set; }
    public long Number { get; set; }
}

public class Item2
{
    public long Addr { get; set; }
    public string Description { get; set; }
    public ulong Pointer{ get; set; }
}

Создается items1 и Item2:

var items1 = new Dictionary<ulong, Item1>();
items1.Add(id, new Item1
{
    Addr = Addr,
    Pos = Pos,
    Description = Description,
    Number = Number
    Pointer = Pointer
});

var items2 = new Dictionary<ulong, Item2>();
items1.Add(id, new Item2
{
    Addr = Addr,
    Description = Description,
    Pointer = Pointer
});

Есть список itemPointers, который содержит в себе совпадающие id в items1 и Pointer в item2

List itemPointers = new();

Как создать такой список itemPointers?

Пробовал играться с itemPointers = items1.Select(e =>items2.ContainsKey(e.Pointer)), понимаю что где то в items2.ContainsKey(e.Pointer) должен быть ForEach, но не могу понять где Знаю, что можно сделать так

foreach (var id in items2)
{
    if (items1.ContainsKey(items2[id.Key].Pointer))
    {
        itemPointers.Add(id.Key);
    }
}

Но кажется есть более элегантный(быстрый?) способ это сделать.


Ответы (1 шт):

Автор решения: aepot

Ваш код почти нормальный, но если хочется, можно так:

ulong[] itemPointers = items2
    .Where(pair => items1.ContainsKey(pair.Value.Pointer))
    .Select(pair => pair.Key)
    .ToArray();

А вообще в вашем коде просто можно заменить items2[id.Key].Pointer на id.Value.Pointer и будет норм.

Переименуйте id в pair так как это пара ключ-значение, код лучше читаться будет. Классы Item1 и Item2 тоже можно переименовать во что-то более человекочитаемое.


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

→ Ссылка