这是我想问这个问题的最佳方式,细节如下.我花了一个小时才弄明白如何提问!
假设我有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) 我最近在阅读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) 这可能很难问,但我会尽我所能.在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)
这会跳过代码,但似乎很乱.有更简单的方法吗?