相关疑难解决方法(0)

是否有更短/更简单的for循环版本到x次?

通常我们使用计数器执行类似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){...}"这样的东西?

.net c#

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

如何在表单上双重缓冲.NET控件?

如何DoubleBuffered在遭受闪烁的表单上设置控件的受保护属性?

c# doublebuffered flicker winforms

48
推荐指数
8
解决办法
6万
查看次数

清理使用InvokeRequired乱丢的代码

我知道,当从任何非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测试,而不必在整个地方复制和粘贴此模式?

c# multithreading invoke invokerequired

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

如何使事件处理程序异步运行?

我正在编写一个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())

c# multithreading event-handling synchronous eventargs

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

确定两个路径引用C#中同一文件的最佳方法

在即将到来的Java7中,有一个新的API来检查两个文件对象是否是相同的文件引用.

.NET框架中是否提供了类似的API?

我通过MSDN搜索它,但没有任何启发我.

我希望它很简单,但我不想通过文件名进行比较,这将导致硬/符号链接和不同路径风格的问题.(例如\\?\C:\,C:\).

我要做的是防止重复文件被拖放到我的链接列表中.

c# filesystems api

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

根据背景使前景色为黑色或白色

比如计算rgb组件的平均值然后决定是使用黑色还是白色?

我是否必须在第一步将RGB转换为HSV,因为RGB并不总是人眼看到的?

我正在使用C#

c# colors

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

使用DynamicInvoke直接调用委托和使用DynamicInvokeImpl有什么区别?

DynamicInvoke和DynamicInvokeImpl的文档都说:

动态调用(后期绑定)当前委托表示的方法.

我注意到DynamicInvoke和DynamicInvokeImpl采用了一个对象数组而不是一个特定的参数列表(这是我猜的后期绑定部分).但这是唯一的区别吗?DynamicInvoke和DynamicInvokeImpl之间有什么区别.

c# delegates

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

有没有允许单位的语言?

今天在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多年来都不满足 - 这是一个例子.)

syntax programming-languages

23
推荐指数
4
解决办法
861
查看次数

改组所需的IEnumerable扩展方法

我需要一个可以随机播放的扩展方法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)

c# ienumerable shuffle

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

与C#进行多个字符串比较

假设我需要比较字符串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# string

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