小编bmt*_*033的帖子

c#验证该字符串是否包含匹配的括号

如果我有这样的字符串......

"123[1-5]553[4-52]63244[19-44]"
Run Code Online (Sandbox Code Playgroud)

...验证以下条件的最佳方法是什么:

  1. 每个开放式支架都有一个匹配的近支架
  2. 不超过3组括号
  3. 没有嵌套括号(即,[123- [4] 9])

正则表达式是否能够验证所有这些场景?如果没有,LINQ怎么样?

c# regex linq string validation

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

用于两个队列的.NET使用者线程处理的算法(基于优先级)

我有一个C#4.0应用程序,其中"高优先级"和"低优先级"队列实现如下:

BlockingCollection highPriority = new BlockingCollection(1000); BlockingCollection lowPriority = new BlockingCollection(1000);

在highPriority中生成的任何数据都应该在lowPriority中生成的任何数据之前消耗.这里的扭曲是可以随时向两个队列中的任何一个生成数据.因此,在我消耗了highPriority中的所有数据之后,我将使用可能位于lowPriority中的任何数据.如果在我使用lowPriority中的数据时在highPriority中生成新数据,我想完成使用lowPriority中的当前项,然后切换回并处理highPriority中的数据.

谁能建议一个算法来帮助解决这个问题?伪代码很好.非常感谢.

.net algorithm queue producer-consumer

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

在 Visual Studio 安装程序安装项目中创建文件夹

我已经构建了一个 Visual Studio (2010) 安装程序安装项目来部署基本的 WinForms 应用程序,并且我需要我的安装程序根据其运行的操作系统创建几个目录。例如,当安装程序在 Windows XP(及更早版本)上运行时,我需要创建:

Application Folder\NewFolder
Run Code Online (Sandbox Code Playgroud)

如果安装程序在 Vista 或更高版本上运行,我需要在通用应用程序数据文件夹(即 C:\ProgramData)下创建目录,如下所示:

Common Application Data Folder\NewFolder
Run Code Online (Sandbox Code Playgroud)

我看到我可以通过“视图”->“文件系统”添加“自定义文件夹”,但我不确定如何声明这个新文件夹的 DefaultLocation 属性。它的默认值为 [TARGETDIR],但我不确定如何指定要创建的目录的位置。这可以通过 Visual Studio 安装程序安装项目来完成吗?还是我运气不好?

windows-installer setup-project visual-studio

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

关闭任务运行的表单

我有一个WinForms应用程序,包含一个主UI线程和4个任务.我的主窗体有一个私有成员级变量,如下所示:

private bool keepThreadsRunning = false;
Run Code Online (Sandbox Code Playgroud)

在我的主窗体的Load()事件中,我有以下内容:

keepThreadsRunning = true;
var task1Worker = Task.Factory.StartNew(() => DoStuff1());
var task2Worker = Task.Factory.StartNew(() => DoStuff2());
var task3Worker = Task.Factory.StartNew(() => DoStuff3());
var task4Worker = Task.Factory.StartNew(() => DoStuff4());
Run Code Online (Sandbox Code Playgroud)

在我的每个DoStuff()方法中,我基本上都有这个:

while (keepThreadsRunning)
{
  // do work here
  Thread.Sleep(30000); // a couple of my tasks only need to run every 30 seconds or so
}
Run Code Online (Sandbox Code Playgroud)

最后,在我的Form_Closing()事件处理程序中,我有以下内容:

keepThreadsRunning = false;
this.Close();
Run Code Online (Sandbox Code Playgroud)

在任务管理器中查看我的应用程序时,似乎当我关闭表单时该过程结束但我对这四个任务有点困惑.我是否调用this.Close()确实导致这些任务终止(即使它们在Thread.Sleep()调用时发生)?有没有一种更好的方法来实现这一点,而不是我现在正在编码的方式?

编辑 - 我简要介绍了任务取消(当我的应用程序退出时)但我的理解是我的任务需要定期检查取消令牌以确定它们是否已被取消.鉴于我的一些任务需要每30秒运行一次,我无法弄清楚我是如何实现30秒等待(当前是Thread.Sleep())并且仍然要检查取消令牌.

c# task winforms task-parallel-library

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

正则表达式验证字符串只包含0 - 9,+,#,*,[和]

在我的c#应用程序中,我需要验证字符串以确保它们仅包含以下内容:

  • 0 - 9
  • +
  • #
  • *
  • [
  • ]

当我的用户在DataGridView控件的单元格中编辑字符串字段时,我需要验证该值.我的CellValidating事件处理程序目前看起来像这样:

if (!Regex.IsMatch(e.FormattedValue.ToString(), @"\A\b[0-9]+\b\Z"))
{
    // notify the user that the string is invalid and cancel validation
    e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

这似乎适用于0 - 9但我还没有得到一个包含我需要的所有元字符的正则表达式.我尝试一次添加一个元字符到现有的正则表达式,但它不起作用.例如...

if (!Regex.IsMatch(e.FormattedValue.ToString(), @"\A\b[0-9#]+\b\Z"))
Run Code Online (Sandbox Code Playgroud)

...不允许#就像我想的那样.逃避它也没有任何区别.任何人都可以为我阐明这一点吗?

c# regex string validation

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

将WinForms控件绑定到ObjectA.ObjectB.Property

我有一个类代表这样的车:

public class Car
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] string caller = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
        }
    }

    public enum Colors
    {
        LaserRed,
        GenuineGraniteMica,
        BluePearl,
        SandMicaMetallic,
        NightArmorMetallic
    }

    private string _make;
    public string Make
    {
        get { return _make; }
        set {
                _make = value;
                RaisePropertyChanged();
            }
    }

    private string _model;
    public string Model
    {
        get { return _model; }
        set {
                _model = value;
                RaisePropertyChanged();
            }
    }

    private Colors _color; …
Run Code Online (Sandbox Code Playgroud)

c# data-binding winforms

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

动态更改 WPF ComboBox 的 ItemsSource

我有一个包含两个组合框的 WPF 应用程序(我们将它们称为 cbox1 和 cbox2)。cbox1 将其 ItemsSource 通过 XAML 绑定到枚举,如下所示:

<Window.Resources>
    <local:EnumDescriptionConverter x:Key="enumDescriptionConverter"/>
    <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="cbox1DataProvider">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:MyModel+ModeOfTransportationEnum"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

<ComboBox x:Name="cbox1" ItemsSource="{Binding Source={StaticResource cbox1DataProvider}}" SelectionChanged="cbox1_SelectionChanged">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource enumDescriptionConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

cbox1 的 ItemsSource 绑定到的枚举如下所示:

public enum ModeOfTransportationEnum
{
    [Description("BMW X5")]
    BmwX5,
    [Description("Toyota Camry")]
    ToyotaCamry,
    [Description("Ford Focus")]
    FordFocus
}
Run Code Online (Sandbox Code Playgroud)

当我的用户在 cbox1 中选择一个项目时,我想为 cbox2 动态定义 ItemsSource。例如,如果我的用户从 cbox1 中选择“Toyota Camry”,我希望 cbox2 显示值“Red”和“Black”。如果用户从 cbox1 中选择“Ford Focus”,我可能希望 cbox2 显示“Silver”、“Red”和“Blue”。

我可能过度简化了这个例子,但简而言之,我有三个枚举,我想用于 cbox2 的 .ItemsSource 绑定。我想根据用户在 cbox1 …

wpf binding combobox itemssource

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

观察Realm结果集的变化

我正在使用Realm数据库的iOS应用程序上工作。在我的中AppDelegate,我定义了一个Realm结果集,如下所示:

var results: Results<RealmWidget>!
var notificationToken: NotificationToken? = nil

do {
    let realm = try Realm()
    if results == nil {
        results = realm.objects(RealmWidget.self)
    }
} catch {
    print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)

我观察到此结果集的变化如下:

if notificationToken == nil {
    notificationToken = results.observe { (changes: RealmCollectionChange) in
        switch changes {
        case .update(_, _, let insertions, _):
            if insertions.count > 0 {
                // show badge on tab bar
                // play sound to get the user's attention
            }
        default:
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每当 …

realm ios swift

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

TCP套接字服务器如何判断从客户端接收到的数据何时完成?

我正在使用我在 MSDN 上找到的一些异步 TCP 套接字服务器代码,但我不清楚如何检测我是否已收到客户端应该发送的所有数据。在 MSDN 示例中,它们发送 ASCII 字符串(当然,转换为字节),并且在每次读取套接字后,它们检查解码后的字符串是否包含 EOF 标记。如果没有,代码会再次调用 BeginReceive() 以检索更多数据。

我从中接收数据的客户端将发送 8 个不同的二进制“消息”之一(不是 ASCII 字符串)。这些字节数组的长度可以从 6 字节到 ~10KB 不等。我的读取缓冲区为 1KB,因此我很可能需要多次调用 BeginReceive() 才能读取所有数据。客户端是否需要将字节数组的总长度嵌入到数组开头附近的某个位置,以便我确定所有数据均已收到?

c# asynchronous tcp server

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

使用 Json.NET 反序列化一个空数组

我有一个使用 Json.NET v7.0.1 的 C# 应用程序。作为 REST 调用的结果,我以以下形式返回了一些 JSON:

{
"messages": [ {"phoneNumber":"123-456-7890", "smsText":"abcd1234="},
              {"phoneNumber":"234-567-8901", "smsText":"efgh5678="},
              {"phoneNumber":"345-678-9012", "smsText":"12345asdf"} ]
}
Run Code Online (Sandbox Code Playgroud)

如果没有要返回的消息数据,返回的 JSON 如下所示:

{
"messages": [ ]
}
Run Code Online (Sandbox Code Playgroud)

我的 Message 类如下所示:

public class Message
{
    public string PhoneNumber { get; set; }
    public string SmsText { get; set; }

    public Message()
    {
    }

    public Message(string phoneNumber, string smsText)
    {
        PhoneNumber = phoneNumber;
        SmsText = smsText;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试反序列化 JSON 时,我使用了以下代码:

Message[] messages = JsonConvert.DeserializeObject<Message[]>(json, new JsonSerializerSettings
{
    MissingMemberHandling = MissingMemberHandling.Ignore …
Run Code Online (Sandbox Code Playgroud)

c# json.net deserialization

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