我正在从许多来源(MemoryMappedFiles 或 FileStream)读取数据。一个问题是,每次读取字节、int 或其他类型的调用都非常慢。因此,我想将一大块数据读入数组,并将其交给轻量级内存流,并读取其中的各个组件。
问题是.NET 的当前 MemorySrream 只允许在构造函数中使用数组,但我需要一个能够处理 Span 或 Memor 的 Stream。有一个 ReadOnlyMemoryStream 作为内部类深深埋藏在 .NET 源代码中。
有趣的是,虽然 ReadOnlyMemoryStream 比 MemoryStream 慢,但我认为它不会产生很大的差异。
有没有更好的实现方式?
.NET ZipArchive是否允许重命名或移动条目?目前,一旦创建ZipArchiveEntry,就无法更改它的名称.似乎我必须将原始ZipArchiveEntry的流复制到具有更改名称的新ZipArchiveEntry.
谢谢马丁
我有一个DICOM字典,其中包含一组所有从DataElement派生的对象.字典有一个int作为键,DataElement作为属性.我的DICOM字典包含一个this []属性,我可以在其中访问DataElement,如下所示:
public class DicomDictionary
{
Dictionary<int, DataElement> myElements = new Dictionary<int, DataElement>();
.
.
public DataElement this[int DataElementTag]
{
get
{
return myElements[int];
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在的一个问题是我有不同的DataElement类型,它们都是从DataElement派生的,比如DataElementSQ,DataElementOB等.我现在想要做的是使C#中的写入更容易:
public T this<T>[int DataElementTag] where T : DataElement
{
get
{
return myElements[int];
}
}
Run Code Online (Sandbox Code Playgroud)
但这实际上是不可能的.有没有我错过的东西?当然我可以用Getter方法做到这一点,但以这种方式使用它会更好.
Visual Studio 可以调试多个可执行项目。例如,当您想要调试客户端/服务器应用程序时,您的解决方案中客户端和服务器都作为单独的可执行文件,您可以选择这两个项目作为启动项目,以便在运行应用程序时编译并启动这两个可执行文件( s)。
到目前为止一切顺利,但这是为解决方案存储的设置,并且对于每个用户来说都是本地的(它存储在 .vs 文件夹中,当您清除文件夹时该设置将被删除)。此外,它也无法签入源代码管理。这意味着我必须将这一点告诉我们组中的每个人才能调试应用程序。
我希望我可以用 launchConfig.json 做类似的事情,但我不知道如何做。有人已经这样做了吗?
我仍然试图找到一种快速的方法来如何将TOutput类型的通用数组转换为另一个类型为TInput的数组.我的所有数组都是数字数据类型,但由于C#对经常请求的数字没有类型约束,所以我目前不得不忍受这种约束.建议的方法,比如之前投射到一个物体,似乎极大地减慢了我的演员阵容.目前我有一个大的if/else构造,它检查一个类型并使用指针算法强制转换为已定义的类型,但这是为了将来处理大的方法.Parallel.For似乎是一个摆脱指针和加快速度的好方法,但C#泛型约束似乎仍然存在问题,但下面代码中的Tout仍然是一个问题.这是我的代码:
public static OutputType[] Cast<InputType, OutputType>(InputType[] inputArray_in)
{
var aRange = Partitioner.Create(0, inputArray_in.Length);
OutputType[] aResult = new OutputType[inputArray_in.Length];
Parallel.ForEach(aRange, (r) =>
{
for (int i = r.Item1; i < r.Item2; i++)
{
aResult[i] = (OutputType)(inputArray_in[i]);
}
});
return aResult;
}
Run Code Online (Sandbox Code Playgroud)
例:
float[] A = { 0.1f, 0.2f, 0.6f };
int []B = Cast<float, int>(A);
Run Code Online (Sandbox Code Playgroud)
在所有情况下,我的数组类型是数值(float,short,double,...),并且大多数情况下,数组大约是512x512个图像,但是在一个卷中大约1000个切片的堆栈中.你有没有机会有一个简单的方法来执行此操作?
测试代码
public static class CastTest
{
delegate double[] CastMethod(int[] input);
public static unsafe double[] Cast1(int[] input)
{
int N = input.Length;
double[] output = new …Run Code Online (Sandbox Code Playgroud) 我有较大的CT原始数据文件,最大可能超过20到30GB。对于该部门中当前的大多数计算机,我们最多只能使用3GB。但是对于处理数据,我们需要遍历所有可用数据。当然,我们可以通过依次通过读取和写入功能遍历数据来做到这一点。但是有时有必要将一些数据保留在内存中。
当前,我有自己的内存管理,在其中创建了一个所谓的MappableObject。每个原始数据文件都包含20000个结构,每个结构均显示不同的数据。每个MappableObject引用文件中的一个位置。
在C#中,我创建了某种程度上起作用的机制,该机制在必要时自动对数据进行mp和取消映射。从几年前我就知道MemoryMappedFiles,但是在.NET 3.5中,我拒绝使用它,因为我知道在.NET 4.0中,它可以在本地使用。
因此,今天我尝试了MemoryMappedFiles,发现不可能分配需要的内存。如果我有32位系统,而我想分配20GB,则由于超出逻辑地址空间的大小,因此无法使用。这对我来说很清楚。
但是,有没有办法处理像我这样的大文件?我还有其他机会吗?你们如何解决这些问题?
谢谢马丁
我越是深入研究C#和GC,我发现越来越多的事情我不太确定.我一直认为只有在我的课程中有一些非托管资源时才需要Dispose和相应的Finalizer.
但是我有很多场合只有原生的C#类,如果我需要Dispose和相应的Finalizer,我不太清楚.例如,当我将事件处理程序附加到我的事件时.
当我调用Dispose时,是否需要删除事件处理程序.还有人告诉我,如果事件处理程序仍然附加,则可能无法收集该对象.如果是这种情况,GC会以某种方式受到损害.
是否可以总结我何时以及如何实现Dispose和Finalizer?
事实上,我对此有更多疑问,但也许这个问题的答案可以帮助我进一步.
我有某种包含笔记的级联容器,其中有一个主容器包含所有笔记。笔记容器以树状层次结构形式制作,树结构越深入,笔记容器就越具体。我只有一个列表的原因与非常复杂的数据管理有关,但这不是问题的一部分。
\n\n主注释容器有一个ObservableCollection,所有子注释容器都绑定到ObservableCollectionvia CollectionView。子注释容器有一个过滤器,可以过滤掉它们的注释。在常规代码中,一切正常,视图始终显示元素,但是当我将它们绑定到 eg 时ListBox,元素不会被过滤,并且主列表中的所有元素都会显示而不进行过滤。当然我知道有一个ListCollectionView,但是由于 CollectionView 来自IEnumerable,我很好奇如果它ListBox不从 访问 ,那么它如何访问主SourceCollection列表CollectionView。
换句话说,我不太确定为什么我需要应该适合的ListCollectionView非常基本的行为ColletionView。在我看来, 是ListCollectionView强制性的,而不是其他观点真正适合ListBox?
这是一个小样本
\n\nXAML:
\n\n<Window x:Class="ListCollection.MainWindow"\n xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\n xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n Title="MainWindow" Height="350" Width="525">\n <StackPanel Orientation="Horizontal">\n <ListBox Width="100" ItemsSource="{Binding Model}"></ListBox>\n <ListBox Width="100" ItemsSource="{Binding View1}"></ListBox>\n <ListBox Width="100" ItemsSource="{Binding View2}"></ListBox>\n </StackPanel>\n</Window>\nRun Code Online (Sandbox Code Playgroud)\n\nC#:
\n\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Windows;\nusing System.Windows.Data;\n\nnamespace ListCollection\n{\n /// <summary>\n /// Interaktionslogik f\xc3\xbcr MainWindow.xaml\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用EnumDisplaySettings,它使用DEVMODE结构作为结果结构。该DEVMODE结构使用了一些工会内部,这使得它更复杂一点在C#中使用。联合用于对显示器或打印机进行编号。StructLayout.Explicit中的 FieldOffsets 应该可以使用工会。
下面是从pinvoke.net复制的结构。显然,其他一些结构也存在问题,只需将其构造为StructLayout.Sequential即可解决联合,并创建了两个结构,一个用于显示,一个用于打印机。
抛出的异常是字段偏移量70,它表明该字段未对齐或与另一个字段重叠。这是我不了解的,当然字段可以与使用的显式布局重叠,并且字段偏移量68之前的字段也很短,不能与字段偏移量70重叠。这就是Microsoft定义的结构的工作方式。当移动从70 fieldoffset到72它的工作原理。
因此,我实际上一般不会解决我的问题,但是我对这里发生的情况感兴趣。
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
public struct DEVMODE3
{
public const int CCHDEVICENAME = 32;
public const int CCHFORMNAME = 32;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
[System.Runtime.InteropServices.FieldOffset(0)]
public string dmDeviceName;
[System.Runtime.InteropServices.FieldOffset(32)]
public Int16 dmSpecVersion;
[System.Runtime.InteropServices.FieldOffset(34)]
public Int16 dmDriverVersion;
[System.Runtime.InteropServices.FieldOffset(36)]
public Int16 dmSize;
[System.Runtime.InteropServices.FieldOffset(38)]
public Int16 dmDriverExtra;
[System.Runtime.InteropServices.FieldOffset(40)]
public uint dmFields;
[System.Runtime.InteropServices.FieldOffset(44)]
Int16 dmOrientation;
[System.Runtime.InteropServices.FieldOffset(46)]
Int16 dmPaperSize;
[System.Runtime.InteropServices.FieldOffset(48)]
Int16 dmPaperLength;
[System.Runtime.InteropServices.FieldOffset(50)]
Int16 dmPaperWidth; …Run Code Online (Sandbox Code Playgroud)