通常我们使用计数器执行类似for或while循环的操作:
for (int i = 0; i < 10; i++)
{
list.Add(GetRandomItem());
}
Run Code Online (Sandbox Code Playgroud)
但有时你会混淆边界.你可以使用while循环,但如果你犯了一个错误,这个循环是无限的......
以Perl为例,我会使用更明显的
for(1..10){
list->add(getRandomItem());
}
Run Code Online (Sandbox Code Playgroud)
有没有像"doitXtimes(10){...}"这样的东西?
如何DoubleBuffered在遭受闪烁的表单上设置控件的受保护属性?
我知道,当从任何非UI线程操作UI控件时,您必须封送对UI线程的调用以避免问题.一般的共识是您应该使用测试InvokeRequired,如果为true,则使用.Invoke来执行封送处理.
这会导致很多代码看起来像这样:
private void UpdateSummary(string text)
{
if (this.InvokeRequired)
{
this.Invoke(new Action(() => UpdateSummary(text)));
}
else
{
summary.Text = text;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我可以省略InvokeRequired测试并只调用Invoke,如下所示:
private void UpdateSummary(string text)
{
this.Invoke(new Action(() => summary.Text = text));
}
Run Code Online (Sandbox Code Playgroud)
这样做有问题吗?如果是这样,是否有更好的方法来保持InvokeRequired测试,而不必在整个地方复制和粘贴此模式?
我正在编写一个Visual C#程序,它在辅助线程上执行连续的操作循环.偶尔当该线程完成任务时,我希望它触发一个事件处理程序.我的程序执行此操作但触发事件处理程序时,辅助线程等待事件处理程序完成后再继续执行该线程.如何让它继续?这是我目前的结构方式......
class TestClass
{
private Thread SecondaryThread;
public event EventHandler OperationFinished;
public void StartMethod()
{
...
SecondaryThread.Start(); //start the secondary thread
}
private void SecondaryThreadMethod()
{
...
OperationFinished(null, new EventArgs());
... //This is where the program waits for whatever operations take
//place when OperationFinished is triggered.
}
}
Run Code Online (Sandbox Code Playgroud)
此代码是我的某个设备的API的一部分.当触发OperationFinished事件时,我希望客户端应用程序能够执行它所需的任何操作(即相应地更新GUI),而不会导致API操作.
另外,如果我不想将任何参数传递给事件处理程序,我的语法是否正确使用OperationFinished(null, new EventArgs())?
在即将到来的Java7中,有一个新的API来检查两个文件对象是否是相同的文件引用.
.NET框架中是否提供了类似的API?
我通过MSDN搜索它,但没有任何启发我.
我希望它很简单,但我不想通过文件名进行比较,这将导致硬/符号链接和不同路径风格的问题.(例如\\?\C:\,C:\).
我要做的是防止重复文件被拖放到我的链接列表中.
比如计算rgb组件的平均值然后决定是使用黑色还是白色?
我是否必须在第一步将RGB转换为HSV,因为RGB并不总是人眼看到的?
我正在使用C#
DynamicInvoke和DynamicInvokeImpl的文档都说:
动态调用(后期绑定)当前委托表示的方法.
我注意到DynamicInvoke和DynamicInvokeImpl采用了一个对象数组而不是一个特定的参数列表(这是我猜的后期绑定部分).但这是唯一的区别吗?DynamicInvoke和DynamicInvokeImpl之间有什么区别.
今天在C#中编写以下内容时
DateTime.Now.AddYears(-60)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何语言允许使用单位更自然的语法:
DateTime.Now - 60years
Run Code Online (Sandbox Code Playgroud)
有谁知道吗?具体来说,我对将"60年"变成例如"TimeSpan.FromYears(60)"的单位运算符(?)的存在感兴趣.能够定义自己的单元运算符也很简洁,类似于在C#中编写转换运算符的方式
(是的,我知道TimeSpan多年来都不满足 - 这是一个例子.)
我需要一个可以随机播放的扩展方法IEnumerable<T>.它还可以int指定返回的大小IEnumerable.更好地保持不变性IEnumerable.我目前的解决方案IList-
public static IList<T> Shuffle<T>(this IList<T> list, int size)
{
Random rnd = new Random();
var res = new T[size];
res[0] = list[0];
for (int i = 1; i < size; i++)
{
int j = rnd.Next(i);
res[i] = res[j];
res[j] = list[i];
}
return res;
}
public static IList<T> Shuffle<T>(this IList<T> list)
{ return list.Shuffle(list.Count); }
Run Code Online (Sandbox Code Playgroud) 假设我需要比较字符串x是"A","B"还是"C".
使用Python,我可以使用运算符来轻松检查.
if x in ["A","B","C"]:
do something
Run Code Online (Sandbox Code Playgroud)
使用C#,我可以做到
if (String.Compare(x, "A", StringComparison.OrdinalIgnoreCase) || ...)
do something
Run Code Online (Sandbox Code Playgroud)
它可以与Python更相似吗?
我需要添加System.Linq以便使用不区分大小写的Contain().
using System;
using System.Linq;
using System.Collections.Generic;
class Hello {
public static void Main() {
var x = "A";
var strings = new List<string> {"a", "B", "C"};
if (strings.Contains(x, StringComparer.OrdinalIgnoreCase)) {
Console.WriteLine("hello");
}
}
}
Run Code Online (Sandbox Code Playgroud)
要么
using System;
using System.Linq;
using System.Collections.Generic;
static class Hello {
public static bool In(this string source, params string[] list)
{
if (null == …Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×1
api ×1
colors ×1
delegates ×1
eventargs ×1
filesystems ×1
flicker ×1
ienumerable ×1
invoke ×1
shuffle ×1
string ×1
synchronous ×1
syntax ×1
winforms ×1