【问题标题】:What is the most compact and/or efficient way to extract multiple (non-consecutive) values from a list using indexing使用索引从列表中提取多个(非连续)值的最紧凑和/或有效的方法是什么
【发布时间】:2019-11-20 21:45:52
【问题描述】:

我有以下列表:

List<int> listOfInt = new List<int> {10, 20, 30, 40, 50};

我现在得到一个索引列表,指向要从 listOfInt 中提取的值:

int[] idxList= new int[] { 2, 4, 1 };

现在,我想按索引(根据提供的 idxList)从 listOfInt 中提取所有值到另一个列表中。
这是我想出的,似乎可行,但我想摆脱这个 foreach 循环。如何才能做到这一点?

List<int> newList= new List<int>();
foreach(var idx in idxList) newList.Add( listOfInt.ElementAt(idx) );

解决方案:
{30, 50, 20} 将被写入 newList

【问题讨论】:

  • 您说“高效”,但您似乎在寻找更简单/更好看的代码,而不是性能更好的代码,对吧?
  • 好吧,这取决于,如果没有 foreach 循环,我们能否做得更高效?
  • 不管你喜欢与否,都必须循环一些东西,既然是这样,现在我们要进行微优化了,我建议找一个基准测试器并尝试一些事情
  • 好的,谢谢,你是说我的解决方案已经是最优的了吗?
  • 这个问题可能比这里更适合codereview.stackexchange.com,但请查看他们的网站指南

标签: c# list indexing


【解决方案1】:

好吧,这取决于,如果没有 foreach 循环,我们能否做得更高效?

foreach() 获取一个枚举器并遍历列表。您可以提出的任何其他解决方案最终都必须这样做,因为您需要处理索引列表中的每个项目。

所以不,您无法提高效率。或者,如果您写出所有要求和假设,也许您可​​以这样做,但这绝不会成为您代码的性能瓶颈。

CPU 周期很便宜。由于脑力开销,编写和阅读简洁的代码都很昂贵。

您可以使用下面@Sohaib 演示的 Linq,但这不会明显提高效率。

【讨论】:

  • 感谢您的提示,谢谢。我想我需要适应这两种方法(高效且可读)。
【解决方案2】:

使用 Linq 的简短方法:idxList.Select(i =&gt; listOfInt[i]).ToList()

【讨论】:

  • 哦,我喜欢这样。好东西!它与使用 foreach 循环相比如何?它是更多/更少/相同类型的效率吗?
  • @stackMeUp Select 的源代码使用了一个 foreach
  • 这只是一个简写,据我所知,使用 linq 会带来一些开销
  • @stackMeUp 我建议你阅读this问题的答案。
  • +1 @Sohaib Jundi:我喜欢您的解决方案的一点是,我可以将整个结果返回到一个变量中。使用 foreach 循环时,每次进入循环时都必须清除 newList。
【解决方案3】:

如果你想省略foreach,你可以使用这个:

var result = idxList.Select(i => listOfInt.ElementAt(i));

【讨论】:

    【解决方案4】:

    您正在将项目一一添加到newList。这将创建一些不必要的内存分配。最好给出关于结果大小的新列表提示。

    var listOfInt = new List<int> { 10, 20, 30, 40, 50 };
    var idxList = new [] { 2, 4, 1 };
    
    var newList = new List<int>(idxList.Length);
    
    for (int i = 0; i < idxList.Length; i++)
        newList[i] = listOfInt[idxList[i]];
    

    此外,for 循环在遍历列表 (source) 时往往比 foreach 快。

    【讨论】:

    • 是的,这就是我意识到的,为什么使用@Sohaib Jundi 建议的 Linq 似乎是要走的路。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多