Я могу превратить свой словарь Dictionary<long,MyObj> в список с .Values, где MyObj имеет поле Vector3 с именем position.
Я хотел бы иметь список позиций (тип значения): MyObj.position, например: List<Vector3> positions.
Производительность имеет решающее значение.
Есть ли способ добиться этого на C# с помощью LINQ или иным образом, кроме?
foreach e in myDict
mylist.Add(e.Value.position)
yourDictionary.Select(kvp => kvp.Value.position).ToList()?
Почему отрицательные голоса? До сих пор я просто перебирал и каждый раз составлял список. Спасибо за совет по выбору, CodeCaster! Я предположил, что select предназначен только для фильтрации и не настолько эффективен, насколько мог бы. Это лучший способ?
Как вы определяете эффективность? Select - это O (n), потому что он должен пройти по всем элементам в вашем словаре, но это сделано намеренно. Если вы не хотите снижать производительность, работайте напрямую со словарем.
Против: вероятно, потому, что вопрос не так ясен, и вы не предоставляете никакого кода. <del> (MCVE) </del> Чтобы прояснить, я не голосовал против, я только что пришел.
@PedroGaspar: MCVE применяются только к вопросам устранения неполадок.
Я думаю, что нет никакого способа обойти его, поскольку позиции не являются смежными в памяти. Я думаю, это настолько хорошо, насколько это возможно.
аналогично CodeCaster вы можете выполнять поиск только по значениям yourDictionary.Values.Select (obj => obj.position) .ToList ().
Это быстрее или понятнее, @ sr28?
Единственный способ быть уверенным - это рассчитать время. Создайте секундомер и запустите оба
Я рекомендую проверить время самостоятельно, но LINQ обычно на несколько раз медленнее циклов. foreach (var v in myDict.Values) может быть немного быстрее. Для более быстрой работы вам может потребоваться собственный словарь или изменение подхода / алгоритма. Но перед всем этим убедитесь, что это та часть кода, которую нужно оптимизировать.
Я согласен со Слаем. Подход foreach, вероятно, быстрее. Я посмотрю, смогу ли я получить несколько раз.
Спасибо за время. Я воспроизведу его в своем контексте (на мобильном устройстве), чтобы проверить, сохраняется ли он. У меня есть несколько более сложных вариантов дизайна, если он все еще будет слишком медленным.





Итак, используя приведенный ниже код:
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 - обновляется с выбранным флагом оптимизации. Хотя результат тот же.
что ты уже испробовал?