获取列表>> 使用 LINQ 的 C# 中的元素位置
我有一个带有数字的列表, 我想使用 LINQ 找到最小值(不是值)的位置 示例
:
var lst = new List<int>() { 3, 1, 0, 5 };
现在我正在寻找一个返回我的函数
输出 = 2
因为最小值位于列表中的位置 2。
I have a List with numbers,
and I'd like to find the position of the minimum (not value) using LINQ
Example:
var lst = new List<int>() { 3, 1, 0, 5 };
Now I am looking for a function returning me
output = 2
because the minimum is at position 2 in the list.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
我不一定推荐这种 CPS 风格的代码,但它可以工作并且时间复杂度为 O(n),这与使用 OrderBy:
Change > 的解决方案不同。 >= 如果您想要最后一个最小重复项,而不是第一个。
使用 .minv 获取最小值或两者都不获取同时包含索引和最小值的 2 元组。
我迫不及待地希望 .NET 在 4.0 中获得元组。
I don't necessarily recommend this CPS-style code, but it works and is O(n), unlike the solutions that use OrderBy:
Change > to >= if you want the last minimum duplicate, not the first.
Use .minv to get the minimum value or neither to get a 2-tuple with both the index and the minimum value.
I can't wait for .NET to get tuples in 4.0.
如果在列表中查找 1 个或多个具有相同值的元素的位置:
If looking for the position of 1 or more elements of the same value in a list:
由于您特别要求 LINQ 解决方案,而您得到的只是非 LINQ 解决方案,因此这里有一个 LINQ 解决方案:
但这并不意味着 LINQ 是解决此问题的最佳解决方案...
编辑:
使用更复杂的代码这表现得更好一些:
为了获得最佳性能,您可以使用一个简单的循环来遍历所有项目,同时跟踪最低的项目:
As you specifically asked for a LINQ solution, and all you got was non-LINQ solutions, here's a LINQ solution:
That however doesn't mean that LINQ is the best solution for this problem...
Edit:
With a bit more complex code this performs a little better:
To get the best performance, you would use a plain loop go get through the items, while you keep track of the lowest:
捕获位置的最佳方法是通过
FindIndex
此功能仅适用于 List<>
示例
如果您有枚举器或数组,请使用这种方式
或
The best way to catch the position is by
FindIndex
This function is available only for List<>
Example
If you have enumerator or array use this way
or
我同意 LINQ 不是解决此问题的最佳解决方案,但这里有另一种变体,即 O(n)。 它不排序,只遍历列表一次。
I agree that LINQ isn't the best solution for this problem, but here's another variation that is O(n). It doesn't sort and only traverses the list once.
列表可以包含多个等于最小值的元素(见下文)。
我编写的通用扩展方法
.FindEveryIndex()
适用于整数、字符串……并且非常灵活,因为您可以将条件指定为 Lambda 表达式。另一个优点是它返回与条件匹配的所有索引的列表,而不仅仅是第一个元素。
关于您的问题:最小值可以返回为:
它将返回索引 0、2 和 5,因为
lst1
中的最小值是1
:示例 2:
扩展类:
注意: 将两个代码片段复制到 LinqPad C# 程序中,它会立即运行。
或者,使用 DotNetFiddle 在线运行它。
A list can contain multiple elements which are equal to the minimum value (see below).
The generic extension method
.FindEveryIndex()
I wrote works with integers, strings, ... and is quite flexible because you can specify your condition as Lambda expression.Another advantage is that it returns a list of all indices matching the condition, not just the first element.
Regarding your question: The minimum can be returned as:
It will return the indices 0, 2 and 5, because the minimum in
lst1
is1
:Example 2:
Extension class:
Note: Copy the two code snippets into a LinqPad C# program and it works instantly.
Or, run it online with DotNetFiddle.