小编Sis*_*hus的帖子

如何根据特定条件从另一个列表中创建新的字符串列表?

这是我想问这个问题的最佳方式,细节如下.我花了一个小时才弄明白如何提问!

假设我有5种(或更多)类型的文本文件 - 它们是由科学仪器生成的,每种都有一定的结果.让我们称这些"类型"为A,B,C,D,E.文本文件的实际名称不会将其删除,因此用户无法通过名称轻松查看它们的内容.如果它更容易,我们可以考虑一个"字符串"列表.{我不知道如何处理replcate类型,但我稍后会担心)

我希望为用户提供将文本文件组合成一个集合文件的选项,但挑战在于,将某些类型组合起来是没有意义的(出于我认为不值得进入的原因).

我构建了兼容性的示例矩阵

        A   B   C   D   E
   A    1   1   1   1   0
   B    1   1   1   0   0
   C    1   1   1   1   0
   D    1   0   1   1   1
   E    0   0   0   1   1
Run Code Online (Sandbox Code Playgroud)

所以,这就是说我可以将A与B,C,D组合而不是E(等等).

现在,如果用户从文件列表中选择类型为"A,B和C"的文件(显然没有输入),我想检查选择并说"是,ABC是合法合并"并执行合并.

如果用户选择A,B,C,D,我想说,不,你不能这样做,因为D与B不兼容 - 但是,你可以做A,B,C或A,C,D (因为D不应该是B所在的位置).

还在我这儿?

我在代码中创建了上面的矩阵,并且我得到了一个循环结构,我开始有点混乱,并且认为在我发现自己失去家庭和家庭之前我可能会寻求帮助.关于我如何做出选择,我有一个相当大的评论部分.请记住,"A"可能是"狗","B"可能是"猫"等.

internal class CompatibilityCheck
{
    private List<string> FileTypes;

    public CompatibilityCheck()
    {
        //Strings are unique types for text files
        FileTypes = new List<string> {"A", "B", "C", "D", "E"};
        int[,] CompatibilityMatrix =
            {
                {1, …
Run Code Online (Sandbox Code Playgroud)

c# algorithm

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

当我使用线程将东西打印到控制台时,为什么会产生奇怪的结果呢?

我最近在阅读Rob Miles(这里)的非常好的pdf时进入了Threads .他在第160页(2012年,C#pdf)上有一个例子,但它没有写入控制台只是空循环.

我写了一个非常简单的线程生成循环,它创建了10个线程,在1000的每个倍数上将它们的ID写入屏幕.这很好 - 它向我展示了线程如何一起运行.我的问题从为什么我的输出如此困惑开始?通常当我运行下面的程序时,我会得到多个"Thread 3 Finished"行,我很确定,我应该只有一个.

我从MSDN 添加了一个"锁定"到循环但它似乎仍然产生奇数输出(我将在下面举一个例子).

    namespace ConsoleApplication1
    {
        class Program
        {
            static object sync = new object();

            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread myThread = new Thread(() => DoThis(i));
                    myThread.Start();
                }
                Console.ReadLine();
            }

            static void DoThis(int s)
            {
                lock (sync) // a new addition that hasn't helped
                {
                    for (long j = 0; j < 10000; j++)
                    {
                        if (j % …
Run Code Online (Sandbox Code Playgroud)

c# multithreading thread-safety

8
推荐指数
2
解决办法
1791
查看次数

我可以更改表单控件值但不能触发事件吗?

这可能很难问,但我会尽我所能.在SO和其他地方制作事件的很多东西会引发变化,但我想要相反(至少我想我做了!).

我在窗体(numericUpDowns)上有几个控件.对于每个updown,我正在观察是否已经更改了值并且它将触发"ValueChanged"方法.

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    //do some complicated code ...
} 
Run Code Online (Sandbox Code Playgroud)

这一切都适用于上下控件的更改导致重新计算fomr但是如果我想在方法中设置一些值并且不调用我的ValueChanged方法直到结束怎么办?

我几乎喜欢这样的东西

// start ignoring form events here
numericUpDown1.Value = 500;
numericUpDown2.Value = 50;
numericUpDown3.Value = 0;
// resume detecting form events here !
Run Code Online (Sandbox Code Playgroud)

有没有办法打开和关闭它?这是我应该担心的事情吗?

我有限的C#知识引导我达到这一点的最好的事情是创建一个名为" bIgnoreEvents" 的变量并在我的每个ValueChanged方法中使用它...

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    if (!bIgmoreEvents)
    {
        //do some complicated code ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这会跳过代码,但似乎很乱.有更简单的方法吗?

.net c# events winforms

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

标签 统计

c# ×3

.net ×1

algorithm ×1

events ×1

multithreading ×1

thread-safety ×1

winforms ×1