Список из полей элементов

Я могу превратить свой словарь Dictionary<long,MyObj> в список с .Values, где MyObj имеет поле Vector3 с именем position.

Я хотел бы иметь список позиций (тип значения): MyObj.position, например: List<Vector3> positions.

Производительность имеет решающее значение.

Есть ли способ добиться этого на C# с помощью LINQ или иным образом, кроме?

foreach e in myDict
   mylist.Add(e.Value.position)

что ты уже испробовал?

sr28 23.11.2018 16:38
yourDictionary.Select(kvp => kvp.Value.position).ToList()?
CodeCaster 23.11.2018 16:39

Почему отрицательные голоса? До сих пор я просто перебирал и каждый раз составлял список. Спасибо за совет по выбору, CodeCaster! Я предположил, что select предназначен только для фильтрации и не настолько эффективен, насколько мог бы. Это лучший способ?

quimnuss 23.11.2018 16:41

Как вы определяете эффективность? Select - это O (n), потому что он должен пройти по всем элементам в вашем словаре, но это сделано намеренно. Если вы не хотите снижать производительность, работайте напрямую со словарем.

Robert Harvey 23.11.2018 16:44

Против: вероятно, потому, что вопрос не так ясен, и вы не предоставляете никакого кода. <del> (MCVE) </del> Чтобы прояснить, я не голосовал против, я только что пришел.

Pedro Gaspar 23.11.2018 16:45

@PedroGaspar: MCVE применяются только к вопросам устранения неполадок.

Robert Harvey 23.11.2018 16:45

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

quimnuss 23.11.2018 16:46

аналогично CodeCaster вы можете выполнять поиск только по значениям yourDictionary.Values.Select (obj => obj.position) .ToList ().

sr28 23.11.2018 17:03

Это быстрее или понятнее, @ sr28?

quimnuss 23.11.2018 17:05

Единственный способ быть уверенным - это рассчитать время. Создайте секундомер и запустите оба

sr28 23.11.2018 17:06

Я рекомендую проверить время самостоятельно, но LINQ обычно на несколько раз медленнее циклов. foreach (var v in myDict.Values) может быть немного быстрее. Для более быстрой работы вам может потребоваться собственный словарь или изменение подхода / алгоритма. Но перед всем этим убедитесь, что это та часть кода, которую нужно оптимизировать.

Slai 23.11.2018 17:20

Я согласен со Слаем. Подход foreach, вероятно, быстрее. Я посмотрю, смогу ли я получить несколько раз.

sr28 23.11.2018 17:24

Спасибо за время. Я воспроизведу его в своем контексте (на мобильном устройстве), чтобы проверить, сохраняется ли он. У меня есть несколько более сложных вариантов дизайна, если он все еще будет слишком медленным.

quimnuss 23.11.2018 17:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
13
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, используя приведенный ниже код:

    public static void Main(string[] args)
    {
        var stopwatch1 = new Stopwatch();
        var dictionaryTest = GetDictionary(1000);

        stopwatch1.Start();

        var results = dictionaryTest.Values.Select(x => x.Position).ToList();

        stopwatch1.Stop();

        var stopwatch2 = new Stopwatch();
        stopwatch2.Start();

        var results2 = dictionaryTest.Select(obj => obj.Value.Position).ToList();

        stopwatch2.Stop();

        var stopwatch3 = new Stopwatch();
        stopwatch3.Start();

        var myList = new List<double>();

        foreach (var pair in dictionaryTest)
        {
            myList.Add(pair.Value.Position);
        }

        stopwatch3.Stop();

        Console.WriteLine("results1: " + stopwatch1.Elapsed);
        Console.WriteLine("results2: " + stopwatch2.Elapsed);
        Console.WriteLine("results3: " + stopwatch3.Elapsed);
        Console.Read();
    }

    public static Dictionary<long, MyUser> GetDictionary(int numberOfRows)
    {
        var d = new Dictionary<long, MyUser>();

        for (int i = 0; i < numberOfRows; i++)
        {
            d.Add(1000 + i, new MyUser { Age = 10 + i, Position = 100.01 + i });
        }

        return d;
    }

Это вернуло:

Итак, foreach выглядит самым быстрым из трех, предложенных на моей машине. Тем не менее, стоит проверить себя.

Если выбран вариант «Оптимизировать код»:

На всякий случай, вы компилировали с флагами оптимизации?

quimnuss 23.11.2018 17:39

@quimnuss - обновляется с выбранным флагом оптимизации. Хотя результат тот же.

sr28 23.11.2018 17:50

Другие вопросы по теме