小编mse*_*edi的帖子

是否有接受 Span<T> 或 Memory<T> 的 MemoryStream?

我正在从许多来源(MemoryMappedFiles 或 FileStream)读取数据。一个问题是,每次读取字节、int 或其他类型的调用都非常慢。因此,我想将一大块数据读入数组,并将其交给轻量级内存流,并读取其中的各个组件。

问题是.NET 的当前 MemorySrream 只允许在构造函数中使用数组,但我需要一个能够处理 Span 或 Memor 的 Stream。有一个 ReadOnlyMemoryStream 作为内部类深深埋藏在 .NET 源代码中。

有趣的是,虽然 ReadOnlyMemoryStream 比 MemoryStream 慢,但我认为它不会产生很大的差异。

有没有更好的实现方式?

.net c# .net-core

13
推荐指数
2
解决办法
7778
查看次数

Zip存档:我可以重命名或移动ZipArchiveEntry吗?

.NET ZipArchive是否允许重命名或移动条目?目前,一旦创建ZipArchiveEntry,就无法更改它的名称.似乎我必须将原始ZipArchiveEntry的流复制到具有更改名称的新ZipArchiveEntry.

谢谢马丁

.net c# zip

8
推荐指数
1
解决办法
3043
查看次数

我可以拥有通用的[]属性吗?

我有一个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方法做到这一点,但以这种方式使用它会更好.

c# generics

7
推荐指数
1
解决办法
6992
查看次数

将 launchSettings.json 用于多个启动项目

Visual Studio 可以调试多个可执行项目。例如,当您想要调试客户端/服务器应用程序时,您的解决方案中客户端和服务器都作为单独的可执行文件,您可以选择这两个项目作为启动项目,以便在运行应用程序时编译并启动这两个可执行文件( s)。

到目前为止一切顺利,但这是为解决方案存储的设置,并且对于每个用户来说都是本地的(它存储在 .vs 文件夹中,当您清除文件夹时该设置将被删除)。此外,它也无法签入源代码管理。这意味着我必须将这一点告诉我们组中的每个人才能调试应用程序。

我希望我可以用 launchConfig.json 做类似的事情,但我不知道如何做。有人已经这样做了吗?

visual-studio

7
推荐指数
0
解决办法
1146
查看次数

如何将通用数组转换为另一种类型?

我仍然试图找到一种快速的方法来如何将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)

c# arrays generics

6
推荐指数
2
解决办法
4965
查看次数

MemoryMappedFiles:可以为文件分配多少内存

我有较大的CT原始数据文件,最大可能超过20到30GB。对于该部门中当前的大多数计算机,我们最多只能使用3GB。但是对于处理数据,我们需要遍历所有可用数据。当然,我们可以通过依次通过读取和写入功能遍历数据来做到这一点。但是有时有必要将一些数据保留在内存中。

当前,我有自己的内存管理,在其中创建了一个所谓的MappableObject。每个原始数据文件都包含20000个结构,每个结构均显示不同的数据。每个MappableObject引用文件中的一个位置。

在C#中,我创建了某种程度上起作用的机制,该机制在必要时自动对数据进行mp和取消映射。从几年前我就知道MemoryMappedFiles,但是在.NET 3.5中,我拒绝使用它,因为我知道在.NET 4.0中,它可以在本地使用。

因此,今天我尝试了MemoryMappedFiles,发现不可能分配需要的内存。如果我有32位系统,而我想分配20GB,则由于超出逻辑地址空间的大小,因此无法使用。这对我来说很清楚。

但是,有没有办法处理像我这样的大文件?我还有其他机会吗?你们如何解决这些问题?

谢谢马丁

c# memory memory-management dynamic-memory-allocation

5
推荐指数
1
解决办法
3009
查看次数

我是否必须删除处理程序

我越是深入研究C#和GC,我发现越来越多的事情我不太确定.我一直认为只有在我的课程中有一些非托管资源时才需要Dispose和相应的Finalizer.

但是我有很多场合只有原生的C#类,如果我需要Dispose和相应的Finalizer,我不太清楚.例如,当我将事件处理程序附加到我的事件时.

当我调用Dispose时,是否需要删除事件处理程序.还有人告诉我,如果事件处理程序仍然附加,则可能无法收集该对象.如果是这种情况,GC会以某种方式受到损害.

是否可以总结我何时以及如何实现Dispose和Finalizer?

事实上,我对此有更多疑问,但也许这个问题的答案可以帮助我进一步.

.net c# events eventhandler

5
推荐指数
1
解决办法
617
查看次数

CollectionView:绑定到例如 ListBox 时过滤器不起作用

我有某种包含笔记的级联容器,其中有一个主容器包含所有笔记。笔记容器以树状层次结构形式制作,树结构越深入,笔记容器就越具体。我只有一个列表的原因与非常复杂的数据管理有关,但这不是问题的一部分。

\n\n

主注释容器有一个ObservableCollection,所有子注释容器都绑定到ObservableCollectionvia CollectionView。子注释容器有一个过滤器,可以过滤掉它们的注释。在常规代码中,一切正常,视图始终显示元素,但是当我将它们绑定到 eg 时ListBox,元素不会被过滤,并且主列表中的所有元素都会显示而不进行过滤。当然我知道有一个ListCollectionView,但是由于 CollectionView 来自IEnumerable,我很好奇如果它ListBox不从 访问 ,那么它如何访问主SourceCollection列表CollectionView

\n\n

换句话说,我不太确定为什么我需要应该适合的ListCollectionView非常基本的行为ColletionView。在我看来, 是ListCollectionView强制性的,而不是其他观点真正适合ListBox

\n\n

这是一个小样本

\n\n

XAML:

\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>\n
Run Code Online (Sandbox Code Playgroud)\n\n

C#:

\n\n
using 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)

c# wpf xaml

2
推荐指数
1
解决办法
2542
查看次数

DEVMODE结构中C#StructLayout.Explicit的对齐错误

我正在尝试使用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)

c# pinvoke interop

1
推荐指数
1
解决办法
467
查看次数