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 шт):
Ваш код почти нормальный, но если хочется, можно так:
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 тоже можно переименовать во что-то более человекочитаемое.
Если возникает случай где без разницы что использовать, список или массив, всегда выбирайте массив. Он более легковесный и код работы с массивами подлежит более серьёзным оптимизациям во время компиляции, чем со списками.