- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有大量的 KeyValuePair<DateTime,decimal>
.我知道在内存中数组是连续的,因为 KVP 是一个值类型,DateTime 实际上是一个 Int64,而 decimal 是一个包含 4 个整数的数组(并且不会改变)。但是,DateTime 不可 blittable,十进制也不是原始的。
是否有任何方法来滥用类型系统并获取指向数组的不安全指针并将其作为字节使用? (当这两种类型是结构的一部分时,GCHandle.Alloc
不能使用它们,但可以使用这些类型的数组。)
(如果您对原因感兴趣,我现在手动将数组转换为我认为是 1 对 1 byte[] 表示形式,而且速度很慢)
最佳答案
最后还有一个公共(public)工具:System.Runtime.CompilerServices.Unsafe package。
下面是一个通过的测试:
using System.Runtime.CompilerServices.Unsafe;
[Test]
public unsafe void CouldUseNewUnsafePackage() {
var dt = new KeyValuePair<DateTime, decimal>[2];
dt[0] = new KeyValuePair<DateTime, decimal>(DateTime.UtcNow.Date, 123.456M);
dt[1] = new KeyValuePair<DateTime, decimal>(DateTime.UtcNow.Date.AddDays(1), 789.101M);
var obj = (object)dt;
byte[] asBytes = Unsafe.As<byte[]>(obj);
//Console.WriteLine(asBytes.Length); // prints 2
fixed (byte* ptr = &asBytes[0]) {
// reading this: https://github.com/dotnet/coreclr/issues/5870
// it looks like we could fix byte[] and actually KeyValuePair<DateTime, decimal> will be fixed
// because:
// "GC does not care about the exact types, e.g. if type of local object
// reference variable is not compatible with what is actually stored in it,
// the GC will still track it fine."
for (int i = 0; i < (8 + 16) * 2; i++) {
Console.WriteLine(*(ptr + i));
}
var firstDate = *(DateTime*)ptr;
Assert.AreEqual(DateTime.UtcNow.Date, firstDate);
Console.WriteLine(firstDate);
var firstDecimal = *(decimal*)(ptr + 8);
Assert.AreEqual(123.456M, firstDecimal);
Console.WriteLine(firstDecimal);
var secondDate = *(DateTime*)(ptr + 8 + 16);
Assert.AreEqual(DateTime.UtcNow.Date.AddDays(1), secondDate);
Console.WriteLine(secondDate);
var secondDecimal = *(decimal*)(ptr + 8 + 16 + 8);
Assert.AreEqual(789.101M, secondDecimal);
Console.WriteLine(secondDecimal);
}
}
关于c# - 在 C# 中获取指向 KeyValuePair<DateTime,decimal> 数组的不安全指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32864239/
我有一个 List> .我想知道 KeyValuePair谁拥有最大值 Key . 但是,我想获取 key 的值。不仅是 key 。 我能做到: int myValue = myListe.Max(
C#我在我的主 KeyValuePair 中使用 KeyValuePair 作为键。这是我的问题: 如果我有“KeyValuePair”,声明如下: KeyValuePair varName = ne
在 C# 中,如何将 KeyValuePair 转换为 KeyValuePair?我尝试了以下但它不起作用: public static KeyValuePair DoTheCast(KeyValue
以这种糟糕的数据结构结束: List>> 它不太可能变得很大(我估计 > 这很容易在 .NET 2.0 中编写 - 它基本上只是一个值的三元组,而不是在 KeyValuePair 中有 2 个。不过,
查看System.Collections.Generic.Dictionary , 它清楚地实现了 ICollection> ,但没有所需的“void Add(KeyValuePair item)”功
是否可以使用自定义结构来代替 KeyValuePair? 而不是 For Each kvp As KeyValuePair(Of class1,class2) In myDict Dim c1 A
我们如何验证 (.NET 2) 如果 KeyValuePair是否已分配值? Dim pair as KeyValuePair(Of A, B) = Nothing if pair.??? Then
我的 list返回 显然。如何在我的 KeyValuePair 中附加第二个字符串并添加我从第二次数据库调用返回的 ID? // Database calls here KeyValu
编辑:文化 这些内部操作表明不变文化 OrdinalIgnoreCase最合适。 KeyValuePair 是密封的。如果我有 var a = KeyValuePair("foo",1)和 var b
我正在用 C#/.NET 4.5 编写一个应用程序,我有一个定义如下的字典: Dictionary d = new Dictionary(); 我的整数键是连续且唯一的,除了空字符串外,我的值也将是唯
我正在执行 LINQ 查询以从数据库、年龄和日期中获取 2 个字段中的所有值。我想在图表上显示 5 个最高年龄的数字。为此,我试图将年龄和日期存储在 2 个单独的列表 ageList 和 dateLi
我有一个从数据库中填充的字典。 如果只返回一条记录,如何访问KeyValuePair? 我有这个代码: Dictionary CandidatePlatypiDict = PlatypusID > 0
假设我有 List> d 我知道字符串,但我想找到它的整数。如何在此列表中找到键值对? 最佳答案 你会这样写: var result = d.Where(kvp => kvp.Value == "s
我有一个具有 KeyValuePair 类型属性的对象。 我想从数据库中读取一些数据并将结果存储在这个 KeyValuePair 类型字段中。 myObject.KeyValuePairs = ctx
我有一个 IEnumerable对于具有 string 的实体和一个 int成员。 我需要将其转换为 KeyValuePair 的数组反之亦然。 它因转换错误而失败。 [DataContract] p
我有一个 IEnumerable> keyValueList 类型的对象, 我正在使用 var getResult= keyValueList.SingleOrDefault(); if(getR
我正在 build 一个 Dictionary带 key 型KeyValuePair .使用时KeyValuePair.Create内Dictionary初始化程序它不需要模板类型并且它正确地推断了类
我有一个列表 KeyValuePair在 C# 中格式为 KeyValuePair .我想从列表中删除具有重复值的项目。 具有 {X,Y} 的 Point 对象坐标。 示例数据: List> Data
我有这个代码: List>> aux = retEmpty.ToList(); aux.ForEach(x => ret.Add(x.Key, x.Value)); 我需要按第一个元素(“string
我有一个方法需要以下内容: public static List ParetoBuildBySum(List> inputData) 我有以下 linq 查询,并希望传入 KeyValueP
我是一名优秀的程序员,十分优秀!