我有两组字典,每组字典都包含相同的键并具有初始化值。
使用不安全的代码,我想交换他们的地址:
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)我是否需要完全转移到包装器或不同的数据结构才能执行所描述的地址交换?
最佳答案
我同意马丁·乌尔里希的回答。
表达式d1[index]
不是变量。这是对 get
的调用Dictionary<,>
定义的索引器的访问器。您不能使用 &
获取指向它的指针。运算符。
此外,在本例中,它的类型是 List<object>
。您只能使用指向值类型的指针,并且 List<>
是 class
类型。
即使您确实拥有真实的存储位置,并且其类型为 object[]
,这仍然是不可能的,因为数组的元素类型是 object
。所以arr[0]
(对应于 d1[index][0]
)将是 class
再次输入,您将无法获取该地址。
斯科特·张伯伦(Scott Chamberlain)对您的问题的评论提供了一种简单的方法。只需使用
void SwapEntries(string index)
{
var tmp = d1[index];
d1[index] = d2[index];
d2[index] = tmp;
}
这仅涉及将引用传递给两个现有的 List<object>
有问题的实例。
关于C# - 通过指针对字典值进行不安全交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44102604/