相关疑难解决方法(0)

执行forloop时发生IndexOutOfRangeException

IEnumerable<char> query = "Not what you might expect";
string vowels = "aeiou";
for (int i = 0; i < vowels.Length; i++)
query = query.Where (c => c != vowels[i]);
foreach (char c in query) Console.Write (c);
Run Code Online (Sandbox Code Playgroud)

发生异常IndexOutOfRangeException。为什么会发生这个异常,一切看起来都很好。

提前致谢。

解决方案

for (int i = 0; i < vowels.Length; i++)
{
char vowel = vowels[i];
query = query.Where (c => c != vowel);
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,这些代码有什么区别。请分享详细信息。

.net c#

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

不可能的concat没有为每个循环工作

我正在尝试在Concat每个循环中使用IEnumerable 的方法,但我无法使其正常工作.

IEnumerable<Geo> geos = null;
foreach (string a in values)
{
    if (geos == null)
        geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a)));
    else
        geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a))));
}
Run Code Online (Sandbox Code Playgroud)

它返回的只是值中最终"a"的值,对于值中存在的记录计数也是如此.

因此,如果我有1,2,3作为值,它只返回3.我也需要1,2和3的值.

我哪里错了?

c# linq c#-4.0

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

线程:不正确的变量传递C#

用户.我遇到了一个我无法找到答案的问题.我是Threading的新手(在C#中),遇到了这个问题.我有这个带有效果的图像编辑器,但由于它运行得太慢,我试图将其拆分为线程.问题是他总是使用效果列表中的最后一项运行"CreatePreview"命令.因此,如果我激活了效果:"黑/白","Sature"和"GreenFilter",它将尝试使用greenfilter创建3个预览.

任何人都可以帮我解决这个问题吗?

private void CreatePreviews(string fileName, List<IEffect> effects)
{
    List<Task> tasks = new List<Task>();
    foreach (var effect in effects)
    {
        //previews.Add(effect, CreatePreview(fileName, effect));
        Task task = new Task(delegate()
        {
            string result = CreatePreview(fileName, effect);
            Dispatcher.BeginInvoke(new Action(
            delegate()
            {
                ShowPreview(result, effect.DisplayName);
            }));

        });
        task.Start();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# variables multithreading

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

在Visual Studio 2010和2012中找到不同的答案

这是示例代码.

var values = new List<string>() { "Stack", "Over", "Go" };

var funcs = new List<Func<string>>();

foreach(var v in values) 

  funcs.Add( ()=>v );
foreach(var f in funcs) 

  Console.WriteLine(f());
Run Code Online (Sandbox Code Playgroud)

当我使用visual studio 2010运行此代码时,我得到的输出为: Go Go Go

但是当我在visual studio 2012中尝试相同的代码时,输​​出是: Stack Over Go

为什么表现不一样?

c# visual-studio-2010 visual-studio-2012

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

C#Closure有效吗?

可能重复:
C#在foreach中重用变量是否有原因?
循环操作列表

今天我遇到了关于C#foreach函数的问题,它并没有像我预期的那样给我正确的结果.这是代码:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        int[] data = new int[] { 1, 2, 3, 4, 5 };
        List<Func<int>> actions = new List<Func<int>>();
        foreach (int x in data)
        {
            actions.Add(delegate() { return x; });
        }
        foreach (var foo in actions)
        {
            Console.WriteLine(foo());   
        }
        Console.ReadKey();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

当我在控制台应用程序中运行它并且它在屏幕上打印了5个5.为什么?我只是无法理解.曾经问过一些人,他们只是说这个代码中有封闭,但我对此并不十分清楚,我记得在javascript中,我经常遇到封闭,但在上面的代码中,为什么会有封闭?谢谢.

c# closures

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

闭包对循环变量的正确语义是什么?

考虑以下lua代码:

f = {}

for i = 1, 10 do
    f[i] = function()
        print(i .. " ")
    end
end

for k = 1, 10 do
    f[k]()
end
Run Code Online (Sandbox Code Playgroud)

这将打印从1到10的数字.在这种情况下,i将关闭外部循环的每次迭代的值.这就是我一直都懂得闭合的方式,我很开心......

...直到我将一些lua代码移植到c#中,我试图做同样的事情:

var f = new Action[10];

for (int i = 0; i < 10; i++)
{
    f[i] = (new Action(delegate()
    {
        Console.Write(i + " ");
    }));
}
for (int k = 0; k < 10; k++)
{
    f[k]();
}
Run Code Online (Sandbox Code Playgroud)

现在我将10号打印10次(让我们忘记了lua数组是基于1的).实际上,在这种情况下,闭包对变量起作用,而不是它的值,这很有意义,因为我只是在第一个循环结束后调用函数.

JavaScript似乎具有相同的语义(接近变量):

var f = []

for (var i = 0; …
Run Code Online (Sandbox Code Playgroud)

javascript c# lua closures lambda-calculus

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

如何并行迭代动态值字典?

我试图使用dict中的值副本为每个循环生成线程.

我最初的理解是,这foreach将创造一个新的范围,并导致:

Dictionary<string, string> Dict = new Dictionary<string, string>() { { "sr1", "1" }, { "sr2", "2" } };
foreach (KeyValuePair<string, string> record in Dict) {
    new System.Threading.Timer(_ =>
    {
        Console.WriteLine(record.Value);
    }, null, TimeSpan.Zero, new TimeSpan(0, 0, 5));
}
Run Code Online (Sandbox Code Playgroud)

写道

1
2
2
2
Run Code Online (Sandbox Code Playgroud)

而不是(预期):

1
2
1
2
Run Code Online (Sandbox Code Playgroud)

所以我尝试在foreach中克隆kvp:

KeyValuePair<string, string> tmp = new KeyValuePair<string, string>(record.Key, record.Value);
Run Code Online (Sandbox Code Playgroud)

但这会产生相同的结果.

我也试过了,System.Parallel.ForEach但似乎需要非动态的价值,这对我的字典来说有点火车粉碎.

如何用线程迭代我的字典?

c# multithreading parallel.foreach

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

为什么存储对 int (而不是值)的“引用”?

下面的代码片段将输出数字“10”十次:

\n\n
delegate void Printer();\n\nstatic void Main()\n{\n      List<Printer> printers = new List<Printer>();\n      for (int i = 0; i < 10; i++)\n      {\n           printers.Add(delegate { Console.WriteLine(i); });\n      }\n\n      foreach (var printer in printers)\n      {\n           printer();\n      }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是因为(取自https://www.toptal.com/c-sharp/interview-questions#iquestion-90455):

\n\n
\n

“委托被添加到 for 循环中,\xe2\x80\x9creference\xe2\x80\x9d 到 i 被存储,\n 而不是值本身。因此,在我们退出循环后,\n 变量 i 已被存储设置为 10,因此当每个委托被调用时,传递给所有委托的值都是 10。”

\n
\n\n

我的问题是:为什么存储对 i 的“引用”?

\n

c# delegates

0
推荐指数
1
解决办法
240
查看次数

C# for 和 foreach 中闭包 Lambda 的具体情况

我阅读了有关此主题的不同文章Eric Lippert 的博客和其他文章,并知道为什么这两个代码的工作方式不同

int[] values = { 7, 9, 13 };
List<Action> f = new List<Action>();
foreach (var value in values)
    f.Add( () => Console.WriteLine("foreach value: " + value));
foreach (var item in f)
    item();

f = new List<Action>();
for (int i = 0; i < values.Length; i++)
    f.Add(() => Console.WriteLine("for value: " + ((i < values.Length) ? values[i] : i)));
foreach (var item in f)
    item();
Run Code Online (Sandbox Code Playgroud)

但我没有找到明确的解释,为什么最终(从编译器 c# 版本 5 开始)决定“foreach 循环变量在逻辑上将位于循环体内部,因此闭包每次都会获得一个新的副本”。因为旧的实现提供了使用闭包 Lambda 的更多自由(“按值或按引用”),但要求程序员小心使用它,如果您需要 foreach …

c# foreach lambda closures for-loop

0
推荐指数
1
解决办法
621
查看次数

c#foreach with Action.BeginInvoke

好吧,所以我在这里遇到了一些问题.这是循环.

lock (ClientLocker)
{
    Trace.WriteLine("#WriteAll: " + sm.Header);
    foreach (Client c in Clients)
    {
        if (c.LoggedIn)
        {
            Trace.WriteLine("#TryWriteTo[" + c.Id + "](" + sm.Header + ")");
            LazyAsync.Invoke(() => c.WriteMessage(sm));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是LazyAsync

public static class LazyAsync
{
    public static void Invoke(Action a)
    {
        a.BeginInvoke(a.EndInvoke, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

每个Client包含一个socket,所以我不能Clone这么做.问题是,当我执行Invoketo时c.WriteMessage,由于执行被延迟,它通常不会触发列表中的第一对,并且有时实际上只会在最后一项上触发一大堆.

我知道这与c是一个在Invoke实际被调用之前发生变化的引用有关,但有没有办法避免这种情况?

执行一般for(int i=0 etc循环似乎无法解决此问题.

任何人对我如何解决这个问题都有任何想法?

记住,不能Clone Client.

c# concurrency delegates action invoke

-1
推荐指数
1
解决办法
1204
查看次数