【问题标题】:Retrieve an element from List without loop [closed]从没有循环的列表中检索元素[关闭]
【发布时间】:2016-04-08 11:18:17
【问题描述】:

我想在不使用 for 或 foreach 循环的情况下从列表中检索一个元素或元素列表,原因是我的列表非常大,而且我需要对结果进行另一个循环。从这个角度来看,算法复杂性不是在彼此内部使用两个循环的好主意。

【问题讨论】:

  • 如何确定元素?索引,一个条件?
  • HashTable 可能会对您有所帮助。
  • 确实我有一个对象列表,有时我需要一个属性条件并获取一个我使用 id 的元素。
  • 这可能不是你想要的:你能不能只循环一次列表,同时找到你的项目并进行结果计算?那么这是可能的。或者,您真的需要在循环之前拥有该项目吗?然后,这是不可能的,并且您会被两个嵌套循环的性能所困扰。
  • 向我们展示您的“清单”声明!!!

标签: c# list


【解决方案1】:

答案取决于确定您想要哪个元素的平均值。事实是,如果您拥有要查找的元素的索引,则 List 将具有 O(1) 复杂性;否则它将始终具有 O(n) 复杂度(LINQ 与否)。

但是,如果您需要提取集合中的许多元素,然后对它们使用循环,LINQ 将使您能够轻松地仅使用一个循环(在集合的所有元素上)完成:

foreach (var element in myCollection.Where(myCondition))

如果您想找到复杂度小于 O(n) 的元素,您应该查看 HashSet<T>Dictionary<TKey, TValue>

但是您的问题不够精确,无法给您更具体的答案。

【讨论】:

    【解决方案2】:

    如果您可以在不循环的情况下从列表中获取一个元素,您可以使用 LINQ(first、firstOrdefault、Single、SingleOrdefault)函数,这些函数可以为您提供列表中的一个元素,如果您需要多次,您可以使用 where以 ToList 结尾的演员。所有这些函数都作为参数 lambda 表达式。 还要检查这些链接,看看为什么我是对的:

    只要你有一个大的集合,LINQ 是正确的选择。

    您还可以查看此示例,了解为何 LINQ 是处理大型数组“400k 个元素 +”的最佳选择:

    结果如下:

    Real run:
    TestLINQ count: 499854
    0:00:00:00.0170207
    TestForeach count: 499854
    0:00:00:00.0200297
    TestFor count: 499854
    0:00:00:00.0198944
    

    如果我们使用更大的数组,则 LINQ、For 和 Foreach 之间的区别将显而易见。

    【讨论】:

    • Linq 使用循环(内部)
    • 是的,但它比正常循环花费的时间更少。试一试并计算执行时间以查看结果。
    • 我很确定 LINQ 比普通程序运行得更快,你可以自己尝试,因为我做了不止一次,结果完全不同,链接程序消耗的时间少于几秒钟正常循环
    • LINQ 比循环慢。见stackoverflow.com/questions/3156059/…。但这实际上并不是在大多数情况下不使用它的论据。
    • 我会说这些都是理论。现实完全不同。我在程序中使用了秒表,然后使用了普通的 for 和 LINQ 函数,因此使用 LINQ 可以减少几秒钟。
    猜你喜欢
    • 2020-12-29
    • 2016-07-06
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多