我正在尝试启动一个新线程并将参数传递给我的一个方法。参数是List<string>
,包含大约20个字符串项。我可以使用以下代码传递数组:
List<string> strList = new List<string>();
Thread newThread = new Thread(new ParameterizedThreadStart(Class.Method));
newThread.Start(strList);
我的方法定义为:
public void Method(object strList)
{
//code
}
我的问题是如何在这个对象中包含的每个字符串中运行foreach循环?
答案 0 :(得分:10)
三个选项:
按原样使用ParameterizedThreadStart
,并在方法中进行投射:
public void Method(object strList)
{
List<string> list = (List<string>) strList;
// Use list here
}
使用匿名函数以强类型方式捕获变量,并从匿名函数中调用强类型方法:
List<string> strList = new List<string>();
ThreadStart action = () => Method(strList);
new Thread(action).Start();
...
public void Method(List<string> list)
{
// Use list here
}
使用更高级别的抽象,例如任务并行库或并行LINQ;取决于你正在做什么,这可能会使事情变得更简单。
如果你做想要开始一个新线程,我会使用第二种方法 - 将“肮脏”本地化到开始新线程的方法。任何这些方法都可行。请注意,如果您将多个信息传递给新线程,则第二种方法最终比创建Tuple
并解压缩更简单。
答案 1 :(得分:2)
您必须将object
类型转换为您的列表类型,例如:以下内容:
public void Method(object strList)
{
var list = (List<string>)strList;
foreach ( var s in list )
{
// Do something.
}
}
答案 2 :(得分:0)
您必须将对象强制转换为实际类型,然后才能使用foreach。
答案 3 :(得分:0)
使用(List<string>
投射对象,然后使用迭代
for (int i = 0; i < list.Count; i++) // Loop through List with for
{
Console.WriteLine(list[i]);
}
答案 4 :(得分:0)
您必须将其强制转换为字符串列表,如下所示:
public void Method(object strList)
{
List<string> internalStringList = strList as List<string>;
//this is a save cast the "internalStringList" variable will
//be null if the cast fails.
}
你也可以这样做:
List<string> internalStringList = (List<string>) strList;
但如果strList不是List
,则可能抛出InvalidCastException
答案 5 :(得分:0)
为了安全起见:
public void Method(object strList)
{
var list = strList as List<string>;
if (list != null)
{
foreach(var item in list )
{
//code here
}
}
}