如何对集合中所有对象的属性执行 .Max() 操作,并返回具有最大值的对象。

10 浏览
0 Comments

如何对集合中所有对象的属性执行 .Max() 操作,并返回具有最大值的对象。

我有一个包含两个int属性的对象列表。这个列表是另一个linq查询的输出结果。对象如下所示:

public class DimensionPair  
{
    public int Height { get; set; }
    public int Width { get; set; }
}

我想找到并返回列表中具有最大`Height`属性值的对象。我可以找到`Height`值的最大值,但无法得到对象本身。我能用linq实现这个功能吗?如何实现?

0
0 Comments

问题的原因是通过对集合中的对象进行排序,然后选择第一个对象来获得具有最大值的对象的属性值,这样会浪费大量的时间对第一个对象之后的对象进行排序,而实际上并不关心这些对象的顺序。解决方法是使用聚合函数来选择基于所要查找的属性的最佳对象。

代码示例中使用了Aggregate函数来实现这个目标。首先定义了一个变量maxHeight,使用Aggregate函数来比较每个对象的Height属性,并返回具有最大Height属性值的对象。同样地,使用Aggregate函数和两个条件来定义了一个变量maxHeightAndWidth,用于比较每个对象的Height和Width属性,并返回具有最大Height和Width属性值的对象。

对于问题的第一个问题,这段代码的时间复杂度是O(n),其中n是集合中对象的数量。对于问题的第二个问题,如果集合为空,那么代码将返回一个默认的空对象。

这个解决方法应该是被接受的答案。其他方法将会多次迭代对象,或者使用不必要的库。代码示例中的maxHeightAndWidth方法在处理顺序不同的集合时表现不一致。例如,如果只有{1, 3}和{3, 1}两个对象,无论顺序如何,它都会返回列表中的第一个对象,所以实际上并不实用。

对于maxHeightAndWidth方法,{1, 3}和{3, 1}是等价的,因为没有对值(高度在宽度之前或宽度在高度之前)进行排序。因为它们是等价的,返回哪个对象应该没有关系。

最坏的情况下,这个解决方法的性能与MaxBy方法一样差,MaxBy方法需要迭代整个列表,而这个方法也是如此。事实上,要想找到最大值,就必须迭代整个列表。

这就是问题的原因和解决方法的总结。

0
0 Comments

问题的出现是因为需要在一个集合中找到具有最大值的属性,并返回该属性所属的对象。解决方法是使用LINQ的OrderByDescending().First()方法来实现。通过对集合进行排序,并返回第一个元素,即可得到具有最大值的对象。

在这个解决方法中,使用MaxObject扩展方法来实现,在遍历集合时,比较当前元素的属性值与最大值,如果当前元素的属性值大于最大值,则更新最大值和最大值所属的对象。这样只需遍历一次集合即可找到最大值,而不需要进行排序等操作。

该解决方法是为了解决更通用的问题,通过声明一个扩展方法来隐藏复杂性,以便在需要时可以更简单地使用。

总结起来,这个问题的解决方法是通过使用LINQ的OrderByDescending().First()方法或自己实现的MaxObject扩展方法来找到具有最大值的属性所属的对象。这样可以在集合中进行一次遍历,而不需要进行排序等其他操作。

0
0 Comments

在这段内容中,提到了一个问题,即如何对集合中所有对象的属性执行.Max()操作,并返回具有最大值的对象。问题的原因是目前没有直接的方法可以实现这个操作。然后,通过提供的解决方法来解决这个问题。

解决方法是使用MoreLINQ库中的扩展方法MaxBy()。这个方法的实现可以在MoreLINQ的GitHub页面中找到。基本上,它是通过迭代数据来找到最大的元素,并记住迄今为止看到的最大元素和它在投影下产生的最大值。

具体的解决方法是使用以下代码:

var item = items.MaxBy(x => x.Height);

这种方法比其他方法更好,因为:

- 它的时间复杂度是O(n),而不是其他解决方法的O(n^2)或O(n log n)。

- 它只使用一次LINQ,避免了对序列进行两次迭代。

- 它更简单易读,每个元素只评估一次投影。

此外,还提到了另一种解决方法,即使用LINQ的Max()方法结合lambda表达式:

var item = items.Max(x => x.Height);

但是,这种方法只返回集合中的最大值,而不是具有最大值的对象。

最后,还提到了使用聚合方法Aggregate()的解决方法:

items.Aggregate((i, j) => i.Height > j.Height ? i : j)

这个方法可以解决问题,但是在可读性方面不如使用MaxBy()方法。

问题的原因是没有直接的方法来执行集合中所有对象属性的.Max()操作并返回具有最大值的对象。解决方法是使用MoreLINQ库中的MaxBy()扩展方法,它通过迭代数据来找到最大的元素,并返回具有最大值的对象。这种方法比其他方法更好,因为它的时间复杂度低,并且更简单易读。

0