-4

有没有办法在 C# 中有效地做到这一点?

鉴于:

List<Thing> listOfThings = new List<Thing>() {};

期望的输出:

String[] thingNames = (Gather up all the (string)Thing.Name values into an array)
Int[] thingID = (Gather up all the (int)Thing.ID values into an array)

我知道有一个listOfThings.ToArray()但我需要的是类似listOfThings.Name.ToArray()listOfThings.ID.ToArray()的东西。

最后,我希望将这些数组用于 Oracle 数组绑定。

谢谢,

~ 肖恩

4

3 回答 3

2

使用 LINQSelect()ToArray()

var names = listOfThings.Select(th => th.Name).ToArray();
var ids = listOfThings.Select(th => th.ID).ToArray();

确保它位于 .cs 文件的顶部:

using System.Linq;

“高效”是指快速、节省内存使用,还是只希望源文件中的字符更少?通常,如果人们关心优化性能或内存,我们建议他们做一些指标以确保确实存在问题。首先优化可读性通常是明智的,而不是对其他人感到悲观。

于 2018-05-17T18:48:09.230 回答
1

你也可以用老式的方式来做,使用for循环。它应该会快一点,因为您只迭代listOfThings一次的集合(随着原始列表中的项目数量和增长,这变得更加明显):

string[] thingNames = new string[listOfThings.Count];
int[] thingIds = new int[listOfThings.Count];

for (int i = 0; i < listOfThings.Count; i++)
{
    thingNames[i] = listOfThings[i].Name;
    thingIds[i] = listOfThings[i].ID;
}
于 2018-05-17T18:55:28.163 回答
0

我在工作中有一些空闲时间,并决定测试两种发布方法(For vs LINQ)之间的速度。根据您的问题,我创建了一个列表,其中包含 100 万个Foo对象,每个对象都带有 aint ID和 a string Name。我将转换过程重复了 100 次,以获得更好的平均时间来制作数组。结果如下:

# of items in list: 1000000
# of trials: 1000
LINQ(Avg): 62.946ms
FOR(Avg): 19.82ms

for对于这种大小的数据集,LINQ 方法比纯循环慢约 3 倍。但总的来说,在宏伟的计划中,差异是微乎其微的。我仍然更喜欢 LINQ 选项的可读性,即使它在技术上较慢。

于 2018-05-17T19:13:14.723 回答