C# 列表的函数错误<;字符串>;:';属性或索引器不能作为out或ref参数传递';
我尝试设置一个动态代码来检查系统中有多少内核。我想我已经把它设置正确了,我为每个核心启动一个任务,然后等待所有任务完成 如图所示,每个任务将返回“list1[i]”和“list2[i]”,如下所示: 但上面显示了此错误: “属性或索引器不能作为out或ref参数传递” 我已经从我编写的其他代码中意识到了这个问题,即不可能返回到那样的索引中 当我试图编写一个动态代码时,考虑到系统中有多少内核。如果系统有24个内核,那么如何才能做我正在尝试做的事情,而不是有24个硬编码列表C# 列表的函数错误<;字符串>;:';属性或索引器不能作为out或ref参数传递';,c#,C#,我尝试设置一个动态代码来检查系统中有多少内核。我想我已经把它设置正确了,我为每个核心启动一个任务,然后等待所有任务完成 如图所示,每个任务将返回“list1[i]”和“list2[i]”,如下所示: 但上面显示了此错误: “属性或索引器不能作为out或ref参数传递” 我已经从我编写的其他代码中意识到了这个问题,即不可能返回到那样的索引中 当我试图编写一个动态代码时,考虑到系统中有多少内核。如果系统有24个内核,那么如何才能做我正在尝试做的事情,而不是有24个硬编码列表 private void
private void button1_Click(object sender, EventArgs e)
{
new Thread(runthreads).Start();
}
void runthreads()
{
int nrCores = Environment.ProcessorCount;
List<List<String>> list1 = new List<List<String>>(); List<List<String>> completelist1 = new List<List<String>>();
List<List<String>> list2 = new List<List<String>>(); List<List<String>> completelist2 = new List<List<String>>();
Task[] tasks = new Task[nrCores];
for (int i = 0; i < nrCores; i++)
{
//Add lists
list1.Add(new List<String>());
list2.Add(new List<String>());
//Start Task
tasks[i] = Task.Factory.StartNew(() => onefunction(1, 2, out list1[i], out list2[i]));
}
Task.WaitAll(tasks); //Wait for all Tasks to complete
//Now add all lists to completelists
for (int i = 0; i < list1.Count; i++)
{
completelist1.AddRange(list1[i]);
completelist2.AddRange(list2[i]);
}
}
void onefunction(int num1, int num2, out List<String> list1, out List<String> list2)
{
//Example code for the function!
list1 = new List<String>(); list2 = new List<String>();
for (int i = 0; i < 1000000; i++)
{
list1.Add("1");
list2.Add("2");
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
新线程(runthreads.Start();
}
void runthreads()
{
int nrCores=环境.ProcessorCount;
List list1=新列表();List completelist1=新列表();
List list2=新列表();List completelist2=新列表();
Task[]tasks=新任务[nrCores];
对于(int i=0;ionefunction(1,2,out list1[i],out list2[i]);
}
Task.WaitAll(tasks);//等待所有任务完成
//现在将所有列表添加到CompleteList
for(int i=0;i
我尝试过使用数组来实现一种方法。是否有人可以确认这是一种有效的方法,或者如果我错过了一些东西,或者可以更快地完成一些事情
例如,如果这是最快的方式,或者这是一个瓶颈,因为速度很重要。我只能想到do.ToArray(),但不知道这样做是否可以“加倍”工作,而不是通过直接添加到数组而不是从列表转换来做更干净的事情?
(请注意,我稍后将不知道要向数组中添加多少元素)
array1=list1.ToArray()代码>我尝试过使用数组来实现一种方法。是否有人可以确认这是一种有效的方法,或者如果我错过了一些东西,或者可以更快地完成一些事情
例如,如果这是最快的方式,或者这是一个瓶颈,因为速度很重要。我只能想到do.ToArray(),但不知道这样做是否可以“加倍”工作,而不是通过直接添加到数组而不是从列表转换来做更干净的事情?
(请注意,我稍后将不知道要向数组中添加多少元素)
array1=list1.ToArray()代码>可以将out与数组索引一起使用。您已经确切地知道有多少项,因此可以使用数组。即使这样,一个更简单的替代方法可能是将列表作为元组或类中的属性从方法中返回。说到数组,我就很糟糕。我真的总是使用列表,如果数组是一个好的选择,我不太确定如何声明它?我不明白你为什么需要out
?为什么不在函数之外创建列表并让onefunction
填充它们呢?最简单的方法是使参数不再out
。调用者创建空列表,然后onefunction
填充它们。..=>一个函数(1,2,列表1[i],列表2[i])
。从onefunction
参数声明中删除out
,并删除list1=new List();list2=新列表()代码>来自正文。原来的人创建了所有这些列表,然后把它们扔掉,这似乎毫无意义。使用它们!可以将out与数组索引一起使用。您已经确切地知道有多少项,因此可以使用数组。即使这样,一个更简单的替代方法可能是将列表作为元组或类中的属性从方法中返回。说到数组,我就很糟糕。我真的总是使用列表,如果数组是一个好的选择,我不太确定如何声明它?我不明白你为什么需要out
?为什么不在函数之外创建列表并让onefunction
填充它们呢?最简单的方法是使参数不再out
。调用者创建空列表,然后onefunction
填充它们。..=>一个函数(1,2,列表1[i],列表2[i])
。从onefunction
参数声明中删除out
,并删除list1=new List();list2=新列表()代码>来自正文。原来的人创建了所有这些列表,然后把它们扔掉,这似乎毫无意义。使用它们!
private void button1_Click(object sender, EventArgs e)
{
new Thread(runthreads).Start();
}
void runthreads()
{
int nrCores = Environment.ProcessorCount;
List<List<String>> list1 = new List<List<String>>(); List<List<String>> completelist1 = new List<List<String>>();
List<List<String>> list2 = new List<List<String>>(); List<List<String>> completelist2 = new List<List<String>>();
Task[] tasks = new Task[nrCores];
for (int i = 0; i < nrCores; i++)
{
//Add lists
list1.Add(new List<String>());
list2.Add(new List<String>());
//Start Task
tasks[i] = Task.Factory.StartNew(() => onefunction(1, 2, out list1[i], out list2[i]));
}
Task.WaitAll(tasks); //Wait for all Tasks to complete
//Now add all lists to completelists
for (int i = 0; i < list1.Count; i++)
{
completelist1.AddRange(list1[i]);
completelist2.AddRange(list2[i]);
}
}
void onefunction(int num1, int num2, out List<String> list1, out List<String> list2)
{
//Example code for the function!
list1 = new List<String>(); list2 = new List<String>();
for (int i = 0; i < 1000000; i++)
{
list1.Add("1");
list2.Add("2");
}
}