小编M.k*_*ary的帖子

为什么正则表达式不关心字符串长度

为什么正则表达式的输入长度不会影响性能,这怎么可能?

生成的字符串如下:128个随机字符.括号内有两个数字.这个重复了很多次.

128 radnom characters....(-2435346|45436) 128 radnom characters....(-32525562|-325346)
Run Code Online (Sandbox Code Playgroud)

正则表达式获取括号内的所有数字.这是模式.

\(([-+]?\d+\|[-+]?\d+)\)
Run Code Online (Sandbox Code Playgroud)

所以比赛就像

-2435346|45436
-32525562|-325346
etc...
Run Code Online (Sandbox Code Playgroud)

以下是执行基准测试的代码.我在生成输入后启动秒表,因为我只想评估匹配时间.

Random rand = new Random();
Func<string> getRandString = // generates 128 random characters.
    () => Enumerable.Range(0, 128).Select(x => (char) rand.Next()).Aggregate("", (a, b) => a + b);
Func<int> getRandInteger = () => rand.Next(); // generates random number.
string format = "{0}({1}|{2})";

// Generate the big string.
StringBuilder bigstr = new StringBuilder();
for (int i = 0; i < 100; i++) // repeat 100 times.
{
    bigstr.Append(string.Format(format, …
Run Code Online (Sandbox Code Playgroud)

c# regex performance-testing

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

Path.GetDirectoryName 如何工作?

当我使用OpenFileDialog“打开文件”时,当然我需要获取文件目录及其名称来加载文件。(要加载xml,要访问文件,我需要完整路径。)

opd打开文件对话框

        if (opd.ShowDialog() == true)
        {
            var names = opd.FileNames;

            foreach (string name in names)
            {
                LoadFile(Path.Combine(Path.GetDirectoryName(name), name));
            }
        }
Run Code Online (Sandbox Code Playgroud)

我的问题是如何Path.GetDirectoryName通过仅获取字符串来获取文件的路径?

Path.GetDirectoryName(name)
Run Code Online (Sandbox Code Playgroud)

name是 Juststring并且此方法仅通过字符串获取其目录?。计算机内可能有数千个同名文件。

简短问题:在哪里opd 引用

编辑:

我认为opd.FileNames只需要文件名。(因为方法名称)

我还发现了一些有趣的事情。

LoadFile(Path.Combine(Path.GetDirectoryName(name), name));
Run Code Online (Sandbox Code Playgroud)

这工作正常,因为Path.Combine只会跳过字符串的相同部分。

前任:

string name = @"C:\Users\Default\xml.xml";
string getDirNameResault= Path.GetDirectoryName(name);// this will be C:\Users\Default
Run Code Online (Sandbox Code Playgroud)

所以 Path.Combine 将是

 Path.Combine(@"C:\Users\Default", @"C:\Users\Default\xml.xml)
Run Code Online (Sandbox Code Playgroud)

女巫归来"C:\Users\Default\xml.xml"

c# path openfiledialog

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

不能在do/while循环中声明的while子句中使用变量

为什么我不允许使用我在里面声明的变量do并在whiledo/while循环中使用它?

do
{
   index += index;
   int composite = index + 1;
   // more code here
} while (UnsetBitmask(bitmasks, composite)); // cannot resolve symbol composite
Run Code Online (Sandbox Code Playgroud)

我第一次看到这个,我认为这是一个编译器错误.所以我多次重启Visual Studio但仍然无法识别变量while.

代码有什么问题,或者这是编译器错误?

c# do-while

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

在WPF中,为什么MouseLeave会触发而不是MouseDown?

这是我的代码:

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="stlNavButtonBorder" TargetType="Border">
            <Setter Property="BorderBrush" Value="#570000FF" />
            <Setter Property="BorderThickness" Value="5" />
            <Setter Property="Height" Value="100" />
            <Setter Property="Width" Value="200" />
            <Setter Property="Margin" Value="10" />

            <Style.Triggers>
                <EventTrigger RoutedEvent="MouseEnter">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation
                                Storyboard.TargetProperty="BorderBrush.Color"
                                To="blue"
                                Duration="0:0:0.25"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="MouseLeave">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation
                                Storyboard.TargetProperty="BorderBrush.Color"
                                To="#570000FF"
                                Duration="0:0:0.25" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="MouseDown">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation
                                Storyboard.TargetProperty="BorderBrush.Color"
                                To="Black"
                                Duration="0:0:0.25" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="stlNavButtonRectangle" TargetType="Rectangle">
            <Setter Property="Fill" Value="#570000FF"/>
        </Style>

        <Style TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Style="{StaticResource …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml

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

更改Ram磁盘的Visual Studio构建路径

目前我有Visual Studio 17 V 15.4.2

是否可以为项目设置不同的构建路径?例如,而不是

C:\Users\[UserName]\source\repos\[MyProject]\[bin|obj]

继续前进

M:\Users\[UserName]\source\repos\[MyProject]\[bin|obj]

请注意,将其自身项目放在内部,C但临时文件会移动到其他位置.我的驱动器M是一个16GB的ram磁盘.

使用RAM磁盘的好处:(诱使我这样做的原因)

  • 更快的构建时间(没有真正的IO)

  • SSD不会因重复重建而磨损.

  • 项目本质上是清理的(带来以下好处)

  • 分享更快,您的项目没有填充不必要的文件,以便您可以轻松地与他人共享文件夹.(代码大小通常小于1MB,但构建对象可以超过1GB)

  • 快速备份,出于同样的原因,您的项目文件夹始终保持清理状态,您可以更快地备份项目.(特别是当你有很多项目时,例如你只能备份100MB而不是10GB)

  • 创建锁定文件的机会较少.(这会导致构建不同步,错误等)在这种情况下格式化ramdisk比使用VS设置或重新启动它更容易.

缺点:

  • 你需要更多的RAM,在我的情况下我有32GB,我可以为它节省16GB.

  • 如果你重置VS或计算机,你松散编译对象,你必须重建(一次)

但使用RAM磁盘的好处显然超重了它的缺点.

好的,既然我说服了你,为什么我想要这个给我路径:)

build visual-studio visual-studio-2017

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

当我将它传递给 IDisposable 类时是否需要处理流?

我写了一段代码。我想确保我以正确的方式处理对象。

我有一个像这样的一次性类,用于从非托管资源读取一些数据。

class MyFileReader : IDisposable
{
    private readonly FileStream _stream;

    public MyFileReader(FileStream stream)
    {
        _stream = stream;
    }

    public void Dispose()
    {
        _stream.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

目前在我的程序中,我像这样处理对象。

        using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            using (MyFileReader reader = new MyFileReader(stream))
            {
                //...
            }
        }
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎没问题。后来我注意到类是通过引用传递的,所以也许如果我处理其中一个,就不需要处理另一个。

我的问题是我可以做这样的事情吗?

        using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            MyFileReader reader = new MyFileReader(stream);
            // Remove IDisposable from MyFileReader and stream will close after using.
        }
Run Code Online (Sandbox Code Playgroud)

还是这个?

        FileStream stream = …
Run Code Online (Sandbox Code Playgroud)

c# idisposable using

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

C#string.Substring()或string.Remove()

我想知道是否使用更好的做法:

var a = b.Substring(6);  
Run Code Online (Sandbox Code Playgroud)

要么

var a = b.Remove(0,6);  
Run Code Online (Sandbox Code Playgroud)

哪一个效率更高/更快?显然,子字符串有更多选项可供您选择,但Remove()无法做到。.很抱歉,如果这是新手问题,我对C#还是陌生的

c# string substring

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

匿名类型(类功能)

我有一个很大的困难.我有问题要回答:为了正确,MyClass应该具备哪些功能?

var myVariable = new MyClass { 25 };
Run Code Online (Sandbox Code Playgroud)

自周五以来我试图找到答案,但我还没有结果.你有什么想法吗?

.net c# variables var

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

原子变量的多个赋值,一个原子操作?

考虑一下我有两个原子布尔,如下所示。

private:
    std::atomic_bool x;
    std::atomic_bool y;
Run Code Online (Sandbox Code Playgroud)

我可以说以下操作是原子的吗?还是我必须用来lock_guard确保将它们分配在一起?

x = y = true; // are two bools assigned together atomically?
Run Code Online (Sandbox Code Playgroud)

还考虑在另一个线程中我想读取这些布尔值。

if(!x && !y) ...
Run Code Online (Sandbox Code Playgroud)

我的假设是,这不是原子的,也许更好用atomic<int>吗?

c++ atomicity

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

switch变量声明如何作用域?

如何可能?

switch (param.ParameterType)
{
    case Type x when x == typeof(byte):
        int invalid;
        break;
    case Type x when x == typeof(short):
        int invalid;
        break;
    case Type x when x == typeof(int):
        break;
    case Type x when x == typeof(long):
        break;
}
Run Code Online (Sandbox Code Playgroud)

问题是,如何x在每个案例范围内没有任何可见的块.同时,变量invalid不能在不同的开关情况下声明.它必须在一个街区内.

如果没有阻塞那么接下来的变量范围是不可能的.

{
    // case byte:
    Type x;
    int invalid;
    // break;

     // case short:
    Type x; // x can not be declared twice.
    int invalid;
}
Run Code Online (Sandbox Code Playgroud)

如果每种情况都有隐形块,则必须遵循以下规则(但不是).

{
    {   // block for each case. …
Run Code Online (Sandbox Code Playgroud)

c# scope switch-statement variable-declaration c#-7.0

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