如何在foreach循环中从其他元素列表填充数组?

3
我希望从其他元素的列表中填充我的类型数组。我想要在foreach循环中完成所有这些操作。
这是否可能?
现在的实现方式是:
// Temp list
List<Parameter> inputData = new List<Parameter>();

// going through collection from which i want to copy
foreach (var parameter in parametersWindow.Parameters)
{
    inputData.Add(new Parameter() { Name = parameter.Name, Value = parameter.Value });
}

// Convertation to array.
Parameter[] parametersToInput = inputData.ToArray();

这就是我想要的做法:
Parameter[] parametersToInput = new Parameter[parametersWindow.Parameters.Count]

foreach (var param in parametersWindow.Parameters)
{
   // parametersToInput.add(new Parameter(parameter))
}

有人能帮助我吗?


你可以使用 Array.Copy 静态方法将一个数组复制到一个新的数组中,而无需使用循环。 - Chris Pickford
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
4个回答

5
一个数组没有Add方法,因为它的大小不能改变。因此,要么同时使用一个List,使用LINQToArray从你的列表中,或者正确地确定数组的大小并使用一个for-loop。
LINQ方法是:
Parameter[] parametersToInput = parametersWindow.Parameters.ToArray();

清单:
List<Parameter> parametersToInput = parametersWindow.Parameters.ToList();

或者

List<Parameter> parametersToInpu = new List<Parameter>(parametersWindow.Parameters);

数组-for-循环方法:
Parameter[] parametersToInput = new Parameter[parametersWindow.Parameters.Count];
for (int i = 0; i < parametersWindow.Parameters.Count; i++)
    parametersToInput[i] = parametersWindow.Parameters[i];

更新:由于parametersWindow.Parameters不是一个Parameter,所以您需要创建一个参数:

Parameter[] parametersToInput = parametersWindow.Parameters
    .Select(p => new Parameter {  Name = p.Name, Value = p.Value})
    .ToArray();

不幸的是,parametersWindow.Parameters的数据不是“Parameter”。所以它需要某种“转换”…… - user2706838
1
数组不是不可变的。也许你想说的是“固定大小”。 - Ahmed KRAIEM
@AhmedKRAIEM:那是一个不幸的措辞选择。已经更正了,谢谢。 - Tim Schmelter
好的,就我理解来说,在这种情况下无法使用foreach。因为我需要数组而不是列表... - user2706838

1
如果你真的想使用Foreach循环,你可以尝试这样做:
//Your List
List<Parameter> inputData = new List<Parameter>();

//Fill Your List Here    

//Your Array
Parameter[] parametersToInput = new Parameter[inputData.Count];

//Filling Your Array from Your List
int index = 0;
inputData.ForEach(e => parametersToInput[index++] = e);

0
我有遗漏什么吗?使用完整的LINQ,无需循环就可以完成此操作。
Parameter[] parametersToInput = parametersWindow.Select(p => p.Parameters).ToArray();

在线。没有戏剧。

如果您想执行其他处理;

Parameter[] parametersToInput = parametersWindow.Select(p => 
{
    ProcessParameters(p);
    return p.Parameters;
}).ToArray();

Select 方法非常适合一对一类型的转换。使用 LINQ,我不知道你为什么要以其他方式完成它 :)


我理解问题要求使用“foreach循环”,但是foreach并不一定是最合适的工具。 - Gusdor

0

你可以使用 Linq:

Parameter[] parametersToInput = parametersWindow.Parameters
                                     .Select(p => 
                                        new Parameter() { 
                                           Name = p.Name, Value = p.Value })
                                     .ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接