我有一个布尔函数,用于许多其他函数的决策.并且每次都向用户提供消息框或允许其继续,具体取决于该函数的返回值.所以我的伪代码可能如下所示:
private bool IsConsented()
{
//some business logic
}
private void NotReal()
{
if (IsConsented())
{
//call function A
}
else
{
MessageBox.Show("Need consent first.");
}
}
private void NotReal2()
{
if (IsConsented())
{
//call function B
}
else
{
MessageBox.Show("Need consent first.");
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更简单的方法,而不是将if-else逻辑硬编码到我的每个函数中.我希望能够有这样的功能:
private void CheckConsent(function FunctionPointer)
{
if (IsConsented())
{
//call the function
FunctionPointer();
}
else
{
MessageBox.Show("Need consent first.");
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以将指针传递给函数.我真的怀疑这与委托有关,但我不知道语法,我不明白如何使用委托传递参数.
我想写一个扩展方法,扩展我班级的一些成员.具体来说,我想扩展一个枚举.但是,这不起作用:
namespace mynamespace
{
public class myclass
{
public enum ErrorCodes
{
Error1, Error2, Error3
}
public static double GetDouble(this ErrorCodes ErrorCode)
{
return (double)((int)ErrorCode);
}
public void myfunc()
{
ErrorCodes mycode;
MessageBox.Show(mycode.GetDouble().ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
具体来说,它不会将GetDouble()识别为扩展名.这不仅仅适用于枚举,我尝试为双打创建扩展方法,也遇到了同样的问题.
我意识到可以使用#'PRINT引用函数来引用PRINT函数.如果我们有一个列表S,其中第一个元素是'PRINT,我们可以使用#(car S)引用它吗?
假设我正在查看一个列表,其中列表中的元素是原子,它们是某些函数的名称.目前,我可以这样做:
(defun aritheval (S)
(funcall
(cond
((eq '+ (car S)) #'+)
((eq '- (car S)) #'-)
((eq '* (car S)) #'*)
((eq '/ (car S)) #'/)
)
'2
'3
)
)
Run Code Online (Sandbox Code Playgroud)
此函数将根据列表S中的第一个元素计算2 + 3,2-3,2*3或2/3 .S包含这些函数的名称.
我正在尝试编写一个比较两个列表的函数,看它们是否代表相同的集合.这是'(a b c d d)与'(d c b a d)代表同一组.元素可以是任何顺序.
这就是我所拥有的,它有效:
(defun samesetp (list1 list2)
(cond
((null list1) (null list2))
((eq list2 (remove (car list1) list2 :count 1)) nil)
(t (samesetP (cdr list1) (remove (car list1) list2 :count 1))))))
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个的原因(remove (car list1) list2 :count 1))是计算两次 - 一次测试remove操作是否真正删除了任何东西,一次递归测试列表的其余部分没有.
任何人都可以提出一种方法来改善这一点,而不使用不同的算法
我有一个看起来像这样的字符串:
-2.2,1.1-6.9,2.3-12.8,2.3
Run Code Online (Sandbox Code Playgroud)
我想写一个函数ParseString(),它将返回带有这些元素的双精度列表:
-2.2
1.1
-6.9
2.3
-12.8
2.3
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是减号的作用类似于分隔符,但也具有语义含义(表示负数).我对正则表达式缺乏经验,我坚持这个.任何专家可以帮我解决这个问题吗?我是用C#写的.
我正在为我的学校做一些初步调查(我作为学生在IT部门工作).这里的学生必须每6个月更改一次密码,其中许多人都很难实施强制执行的(多个)密码规则.也就是说,他们经常不得不多次尝试设置新密码.
规则是:
我有几个问题:
请记住,我不是网络开发人员.此外,请留下任何诙谐的评论,例如"更改密码政策"或"他们只是愚蠢的用户".
我很困惑clEnqueueNDRangeKernel()多次调用时的工作原理.假设我排队10次(例如,使用for循环),每次使用global_work_size = 32.假设内核采用了一个全局参数,它用get_global_id(0)填充.
我的问题是关于global_id的枚举.
我的期望:编号最高的global_id将是(10*32-1)= 319.
实际发生的事情:编号最高的global_id是(32-1)= 31.
任何人都可以解释每个工作项是如何逐步枚举的,因为进行了多个clEnqueueNDRangeKernel()调用?
我有以下功能:
void read_file(char* path, char** data)
{
FILE* file = NULL;
size_t size, result = 0;
*data = NULL;
file = fopen(path, "rb");
if (file == NULL)// error opening file
{
return;
}
fseek(file, 0, SEEK_END);
size = ftell(file) + 1;
rewind(file);
*data = (char*)malloc(size);
if(*data == NULL)
return;
result = fread(*data, 1, size, file);
if (result != size - 1)// error reding file
{
*data = NULL;
}
printf("LINE=%u\n", __LINE__);
(*data)[size-1] = '\0';
printf("LINE=%u\n", __LINE__);
fclose(file);
return;
}
Run Code Online (Sandbox Code Playgroud)
我在两个 …
我遇到一个问题,我无法完全重定向可执行文件的输出.为了讨论,让我们说可执行文件是printnames.exe.
如果我这样做printnames.exe(没有重定向),命令窗口中会显示以下输出:
Adam
Tim
Jesse
Sean
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做printnames.exe > myfile.txt,命令窗口显示:
Tim
Sean
Run Code Online (Sandbox Code Playgroud)
......的内容myfile.txt是:
Adam
Jesse
Run Code Online (Sandbox Code Playgroud)
这怎么可能?代码中的内容会导致这种行为?重定向操作符不应该重定向所有输出吗?
几乎一个月前我在这里问过一个非常类似的问题.
我正在努力理解正则表达式,但没有任何意义.SLak在这一问题解决的效果很好,但是当我尝试使用正则表达式助手在http://gskinner.com/RegExr/只的第一个逗号匹配-2.2,1.1-6.9,2.3-12.8,2.3时给出的正则表达式,|(?<!^|,)(?=-)
换句话说,我找不到一个甚至可以帮助我理解它的正则表达式工具.好吧,够抱怨了.现在我想重新写这个正则表达式,这样我可以做一个Regex.Split()将字符串分隔2.2 1.1-6.9,2.3-12.8 2.3成-2.2,1.1,-6.9,2.3,-12.8,和2.3.
上述问题的不同之处在于现在可以存在前导和/或尾随空格,并且空白可以像逗号一样充当分隔符.
我尝试使用\s|,|(?<!^|,)(?=-)但这不起作用.我尝试使用它来分割293.46701,72.238185,但C#只是告诉我"输入字符串的格式不正确".请注意,SO无法正确显示前导和尾随空格.
编辑:这是执行的代码,以及执行代码后的变量和值.

我有以下代码生成MatchCollection:
var tmp3 = myregex.Matches(text_to_split);
Run Code Online (Sandbox Code Playgroud)
在Matches在tmp3都是字符串,如93.4和-276.2.我真正需要的是将此MatchCollection转换为双精度数组.如何才能做到这一点?
我正在尝试访问一些深度为二深的列表.这是我的代码:
my %english = (
greetings => [("Hello", "What's up?")],
);
my %spanish = (
greetings => [("Hola", "Que pasa?")],
);
my %bighash = (
english => %english,
spanish => %spanish,
);
print 'English greetings: ';
if (my $array = $bighash{'english'}{'greetings'}) {
print "\n$_" for @$array
}
else {
print 'Fail.';
}
Run Code Online (Sandbox Code Playgroud)
但是,if条件始终评估为"false".为什么是这样?
假设我想连续调用四个函数,这些函数在我的某个对象上运行.如果其中任何一个失败,我想返回FAILURE而不调用其他人,我想要返回SUCCESSiff所有这些都成功完成.
通常,我会做这样的事情:
if(function_zero(&myMutableObject) == SUCCESS)
{
return FAILURE;
}
if(function_one(&myMutableObject) == SUCCESS)
{
return FAILURE;
}
if(function_two(&myMutableObject) == SUCCESS)
{
return FAILURE;
}
if(function_three(&myMutableObject) == SUCCESS)
{
return FAILURE;
}
return SUCCESS;
Run Code Online (Sandbox Code Playgroud)
或者,如果我需要做一些清理:
if(function_zero(&myMutableObject) == SUCCESS)
{
status = FAILURE;
goto cleanup;
}
if(function_one(&myMutableObject) == SUCCESS)
{
status = FAILURE;
goto cleanup;
}
if(function_two(&myMutableObject) == SUCCESS)
{
status = FAILURE;
goto cleanup;
}
if(function_three(&myMutableObject) == SUCCESS)
{
status = FAILURE;
goto cleanup;
}
cleanup:
// necessary …Run Code Online (Sandbox Code Playgroud)