У меня есть два набора словарей, каждый из которых содержит одни и те же ключи и имеет инициализированные значения.
Используя небезопасный код, я хотел бы поменять их адреса местами:
Dictionary<string, List<object>> d1 = ...
Dictionary<string, List<object>> d2 = ...
unsafe void SwapEntries(string index)
{
int* tmp = &d1[index];
&d1[index] = &d2[index]
&d2[index] = tmp;
}
Предполагая, что я правильно вспомнил свою арифметику указателя, результат, который я ищу, будет таким:
d1 = new Dictionary<string, List<int>>() { "a", { 1, 2, 3 } };
d2 = new Dictionary<string, List<int>>() { "a", { 4, 5, 6 } };
SwapEntries("a");
Console.WriteLine(d1["a"]); //4,5,6
Console.WriteLine(d2["a"]); //1,2,3
Однако, когда я пытаюсь написать это, я получаю ошибку компиляции «Невозможно взять адрес данного выражения».
1) Есть ли более быстрый способ выполнить обмен адресами, который я пропустил? Производительность является единственным приоритетом здесь.
2) Правильна ли моя арифметика указателя?
3) Нужно ли мне полностью переходить на оболочку или другую структуру данных, чтобы иметь возможность выполнять обмен адресами, как описано?
SwapEntries(string index) { object tmp = d1[index]; d1[index] = d2[index]; d2[index] = tmp; }
классы C# основанными на ссылках (вроде интеллектуальных указателей), здесь нет необходимости использовать указатели. - person Scott Chamberlain   schedule 22.05.2017int*
, ноint
нигде не видно в этом фрагменте кода. У вас есть (что было бы на других языках) rvalue в левой части задания. И вещь, которую вы, кажется, хотите поменять местами, исходя из результата, уже ЯВЛЯЕТСЯ ссылочным типом, поэтому вам не нужно формировать указатель на нее, чтобы получить семантику дескриптора. - person Ben Voigt   schedule 22.05.2017