在以下两个片段中,第一个是安全的还是你必须做第二个?
安全我的意思是每个线程保证从创建线程的相同循环迭代中调用Foo上的方法?
或者你必须将引用复制到一个新的变量"local"到循环的每次迭代?
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Thread thread = new Thread(() => f.DoSomething());
threads.Add(thread);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
-
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Foo f2 = f;
Thread thread = new Thread(() => f2.DoSomething());
threads.Add(thread);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
更新:正如Jon Skeet的回答所指出的,这与线程没有任何关系.
我正在尝试删除一个项目ArrayList,我得到这个例外:
Collection was modified; enumeration operation may not execute.
有任何想法吗?
一位朋友上周问我如何枚举或列出程序/函数/等中的所有变量.出于调试的目的(基本上获取所有内容的快照,以便您可以查看设置了哪些变量,或者是否设置了它们).我环顾四周,找到了一个比较好的Python方法:
#!/usr/bin/python
foo1 = "Hello world"
foo2 = "bar"
foo3 = {"1":"a",
"2":"b"}
foo4 = "1+1"
for name in dir():
myvalue = eval(name)
print name, "is", type(name), "and is equal to ", myvalue
这将输出如下内容:
__builtins__ is <type 'str'> and is equal to <module '__builtin__' (built-in)> __doc__ is <type 'str'> and is equal to None __file__ is <type 'str'> and is equal to ./foo.py __name__ is <type 'str'> and is equal to __main__ foo1 is <type 'str'> and is equal to …
我想枚举Swift中的数组,并删除某些项目.我想知道这是否安全,如果没有,我应该如何做到这一点.
目前,我会这样做:
for (index, aString: String) in enumerate(array) {
//Some of the strings...
array.removeAtIndex(index)
}
Run Code Online (Sandbox Code Playgroud) 您是使用单数还是复数进行枚举?我认为在宣言中使用复数是最合理的
enum Weekdays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
Run Code Online (Sandbox Code Playgroud)
...但我认为使用该类型时,单数形式更有意义,例如
Weekday firstDayOfWeek = Weekday.Monday;
Run Code Online (Sandbox Code Playgroud)
我在某个地方读了一个建议,使用单数的常规枚举和带有标志的复数,但我想听到更多的利弊.
.NET 3.5作业的面试问题是"迭代器和枚举器之间有什么区别"?
这是一个核心区别,LINQ等等.
无论如何,有什么区别?我似乎无法在网上找到一个可靠的定义.毫无疑问,我可以找到两个术语的含义,但我得到的答案略有不同.面试的最佳答案是什么?
IMO迭代器"迭代"集合,枚举器提供迭代功能,但必须调用它.
此外,使用yield关键字据说可以保存状态.究竟是什么状态?是否有这种好处的例子?
是否可以Enumeration使用Lambda Expression 进行迭代?以下代码片段的Lambda表示形式是什么:
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
while (nets.hasMoreElements()) {
NetworkInterface networkInterface = nets.nextElement();
}
Run Code Online (Sandbox Code Playgroud)
我没有在其中找到任何流.
C#/ .NET 4.0中的一个新功能是,您可以在foreach不获取异常的情况下更改您的枚举.请参阅Paul Jackson的博客文章"并发的有趣副作用:在枚举时从集合中删除项目"以获取有关此更改的信息.
执行以下操作的最佳方法是什么?
foreach(var item in Enumerable)
{
foreach(var item2 in item.Enumerable)
{
item.Add(new item2)
}
}
Run Code Online (Sandbox Code Playgroud)
通常我使用IList一个缓存/缓冲区直到结束foreach,但是有更好的方法吗?
我正在尝试找到一种在使用泛型时迭代枚举值的方法.不知道如何做到这一点或是否有可能.
以下代码说明了我想要做的事情.请注意,代码T.values()在以下代码中无效.
public class Filter<T> {
private List<T> availableOptions = new ArrayList<T>();
private T selectedOption;
public Filter(T selectedOption) {
this.selectedOption = selectedOption;
for (T option : T.values()) { // INVALID CODE
availableOptions.add(option);
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我将如何实例化Filter对象:
Filter<TimePeriod> filter = new Filter<TimePeriod>(TimePeriod.ALL);
Run Code Online (Sandbox Code Playgroud)
枚举定义如下:
public enum TimePeriod {
ALL("All"),
FUTURE("Future"),
NEXT7DAYS("Next 7 Days"),
NEXT14DAYS("Next 14 Days"),
NEXT30DAYS("Next 30 Days"),
PAST("Past"),
LAST7DAYS("Last 7 Days"),
LAST14DAYS("Last 14 Days"),
LAST30DAYS("Last 30 Days");
private final String name;
private TimePeriod(String name) {
this.name = name; …Run Code Online (Sandbox Code Playgroud) 在Java 5及更高版本中,你有foreach循环,它可以在任何实现的东西上神奇地工作Iterable:
for (Object o : list) {
doStuff(o);
}
Run Code Online (Sandbox Code Playgroud)
但是,Enumerable仍然没有实现Iterable,这意味着迭代Enumeration你必须执行以下操作:
for(; e.hasMoreElements() ;) {
doStuff(e.nextElement());
}
Run Code Online (Sandbox Code Playgroud)
有谁知道有没有理由Enumeration仍然没有实现Iterable?