4 回答

TA贡献1796条经验 获得超4个赞
你可以停止使用中间变量和ToList()
var secondHighest = myList .Distinct() .OrderByDescending(i => i); .Skip(1) .First();
这将与您的版本相同,但只需要一个语句而不是三个。
我发现阅读代码列表要容易得多。
每个 LINQ 方法都在它自己的行上调用,并且没有中间变量,尤其是那些发生变化的变量(myList
被重新分配,这使得它更难理解)。

TA贡献1779条经验 获得超6个赞
它不是 LINQ-y,但它是 O(N) 且易于阅读:
public static int TheSecondMax()
{
List<int> myList = new List<int>() { 10, 20, 8, 20, 9, 5, 20, 10 };
int max = int.MinValue;
int secondMax = int.MinValue;
foreach (var item in myList)
{
if (item > max)
{
max = item;
}
if (item > secondMax && item < max)
{
secondMax = item;
}
}
return secondMax;
}

TA贡献1864条经验 获得超6个赞
我想我会为此避免使用 LINQ,而只使用标准的“循环遍历每个元素,如果电流高于最大值,则将电流最大值推到第二位,将当前值推到电流最大值”
int sec = int.MinValue;
for(int i =0, m= int.MinValue; i <list.Length; i++)
if(list[i] > m){
sec = m;
m = list[i];
}
您给定的逻辑区分了这些值,因此即使有三个值为 20 的值,看起来 20 也不是列表中的第二高。这是通过 > 实现的。如果我使用 >= 则每 20 个将滚动变量,它的行为就好像没有区别
如果您对性能感兴趣,请在包含几百万个条目的列表中对其进行测试,然后选择满足您对可读性与速度的胃口的一个
- 4 回答
- 0 关注
- 212 浏览
添加回答
举报