【发布时间】:2021-09-08 04:25:53
【问题描述】:
在包含不同大小数组的List<float[]> 中,我想在列表中找到长度最大的那个数组的索引。
我正在使用以下 LINQ 语句:
var index = list
.Select((arr, ind) => new { arr, ind })
.Where(x => x.arr.Length == list.Max(a => a.Length))
.Select(x => x.ind)
.ToList()
.First();
这似乎可行,但查询返回一个元素列表,其 Length 等于 list.Max(a => a.Length),之后我必须使用 .First() 来获取第一个最大索引。
有没有更有效的方法可以让我直接获取索引值而不是List 避免使用 First?
编辑:由于问题被标记为重复,我想澄清一下,我不想要该对象作为回报,而是该对象本身的索引。我浏览了所有我的问题可能重复的帖子,发现它们都返回了MaxLength 的对象。虽然差异很小,但我相信我的问题不是重复的。
编辑:在运行一些测试并测量每个提交的 LINQ 语句所花费的时间后,下表是我的测试期间每种方法所花费的时间(以毫秒为单位)
| Test | Max | Aggregate | GroupBy | GroupBy OrderByDescending |
|---|---|---|---|---|
| First | 13.5946 | 1.8927 | 7.3801 | 7.1061 |
| Second | 12.3544 | 1.9245 | 7.4852 | 7.1755 |
| Third | 12.1003 | 1.8772 | 7.3531 | 6.6891 |
很容易理解,Dmitry Bychenko 给出的Aggregate 方法在这种情况下比任何其他使用的方法都有效得多。 Tim Schmelter 的 GroupBy 和 OrderByDescending Answer 也在做同样的工作,但比 Aggregate 花费更多时间。此外,我想避免使用First。因此,我觉得Aggregate 方法适合我的问题。
【问题讨论】:
-
“我相信我的问题不是重复的”——当然你的问题是重复的。即使没有任何尝试寻找答案,您也很有可能是 Stack Overflow 13 年历史上第一个想知道集合中具有最大值的项目的 index 的人给定属性的值将是无穷小的。当然,通过搜索我们很容易找到这样的例子。由于您认为其他重复项不能充分满足您的需求,因此我添加了两个以上,而不是 直接 解决您对项目 index 的担忧。
-
@PeterDuniho "即使没有任何尝试...." -- 说得轻松。可能我在搜索时没有使用正确的术语,但说我没有正确尝试搜索我的查询是错误的。即使认为我在发布问题之前从未搜索过查询,当它总是通知寻找潜在的解决方案时,这也是愚蠢的。不幸的是,我在发布时无法找到正确的解决方案。是的,您添加的问题正在回答我提出的问题。
-
“我从未搜索过该查询的想法......会很愚蠢。” - 你说。对于实际花费大量时间在网站上阅读和回答问题的任何人来说,事实是人们经常在没有任何努力搜索的情况下发帖,而您的问题当然具有所有标志性迹象正是这样,given how trivial it is to find the duplicates。仅仅因为某人暗示你的行为与所有其他新用户看到的一样,就称他们为白痴是愚蠢的。
-
@PeterDuniho 虽然我没有称你为白痴,也没有任何类似的意图,但你有我诚挚的歉意。但是,即使我尽我最大的努力尝试过,但被指出不正确(是的,我承认我看起来不正确)让我脱离了界限。对不起:-)