【问题标题】:Convert List<Foo>.Property to Array将 List<Foo>.Property 转换为数组
【发布时间】:2018-10-28 03:23:33
【问题描述】:

有没有办法在 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 数组绑定。

谢谢,

~肖恩

【问题讨论】:

  • 高效 - 然后使用经典的 foreach 循环,否则您将获得一堆 LINQ 答案
  • @Fabio 实际上 for 循环会比 foreach 好一点。
  • 高效可能意味着任何事情。最有效率?哪个版本的 .NET?您是否对性能变化的事实感到满意,并且将来可能会再次发生变化?这个问题缺乏适当的限制使其成为一个好问题。投票结束。

标签: c# arrays slice


【解决方案1】:

使用 LINQ Select()ToArray()

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

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

using System.Linq;

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

【讨论】:

  • Ed,我很高兴接受您的回答,因为它为我提供了实现目标的方法。我从来没有以这种方式使用过 .Select 。谢谢你,我每天都学到新东西!
【解决方案2】:

您也可以使用老式的方法,使用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;
}

【讨论】:

  • 在循环中使用两个动作迭代一次和在循环中使用一个动作迭代两次在性能上会很相似,两种方法仍然有 O(1)
【解决方案3】:

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

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

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

【讨论】:

  • 这并不完全是一个答案,但我认为这是对讨论的宝贵贡献,作为评论将不合适。
  • @EdPlunkett 是的,我希望我能以某种方式将其标记为辅助信息,但唉,这是最好的选择。除非已经有答案要测试,否则我永远不会发布它。我什至不在乎这种事情的声誉,我只是想分享我对这两种方法的速度的发现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多