C# 如何检索列表中下一个较高的数字?
我想从列表C# 如何检索列表中下一个较高的数字?,c#,list,linq,C#,List,Linq,我想从列表list中提取myNumber之后的下一个最高数字。列表总是按顺序排列的 List List=新列表(); int myNumber=26 增加(2); 增加(3); 增加(7); 增加(9); 增加(13); 增加(22); 增加(26); 增加(29); 增加(45); 正如您所看到的,下一个更高的数字26是29,因此它应该返回它。 我想在一个单独的整数结果中捕获比数 Console.WriteLine(结果); 您可以获取列表中元素的最后一个索引,然后获取下一个元素,或者在到达
list
中提取myNumber
之后的下一个最高数字。列表总是按顺序排列的
List List=新列表();
int myNumber=26
增加(2);
增加(3);
增加(7);
增加(9);
增加(13);
增加(22);
增加(26);
增加(29);
增加(45);
正如您所看到的,下一个更高的数字26是29,因此它应该返回它。
我想在一个单独的整数结果中捕获比数
Console.WriteLine(结果);
您可以获取列表中元素的最后一个索引,然后获取下一个元素,或者在到达列表末尾时返回0
(或任何其他默认值)
var index=list.LastIndexOf(myNumber);
var结果=索引<列表.计数-1?列表[索引+1]:0;
您还可以在到达最后一个元素时抛出异常
var result=index
根据注释,如果编号不在列表中(索引
等于-1
),并且需要最接近的编号,则可能需要进行额外检查
var index=list.LastIndexOf(myNumber);
var highest=index>=0&&index0?列表[索引-1]:列表[0];
假设您的列表并不总是排序的
var orderedList=list.OrderBy(number=>number.ToList();
var index=orderedList.LastIndexOf(myNumber)+1
变量结果=索引<列表计数
? 列表[索引]
:抛出新ArgumentOutOfRangeException(“已达到最大值”)
列表排序后,您可以使用在O(日志N)而不是O(N)中查找项目:
下面是肖恩答案的扩展版本:
var index = list.BinarySearch(myNumber);
if (index >= 0)
{
int nextNumber = list[index + 1];
Console.WriteLine("NextNumber: " + nextNumber);
int previousNumber = list[index - 1];
Console.WriteLine("PreviousNumber: " + previousNumber);
}
else
{
// Not found
var newIndex = ~index;
if (newIndex > list.Count - 1)
{
Console.WriteLine("myNumber wasn't found in list, myNumber is higher than any entry in list");
Console.WriteLine("NextNumber: " + int.MaxValue);
Console.WriteLine("PreviousNumber: " + list[newIndex - 1]);
}
else
{
Console.WriteLine("myNumber wasn't found in list, newIndex is the next higher number");
Console.WriteLine("NextNumber: " + list[newIndex]);
if (newIndex == 0)
{
Console.WriteLine("myNumber is lower than any entry in list");
Console.WriteLine("PreviousNumber: " + int.MinValue);
}
else
{
Console.WriteLine("PreviousNumber: " + list[newIndex - 1]);
}
}
}
你可以在这里看到它的作用:
如果您的号码不在列表中,该怎么办?您的
索引<0
已经是“未找到”的情况(并且~index
已经是第一个较大邻居的索引)。+1
应该在else
(已找到)的情况下。还要记住,如果列表中可能包含重复项,则最好搜索myNumber+1
。如果搜索到的数字是列表中最大的数字,整个过程就会崩溃。除此之外,我喜欢二进制搜索solution@lakersfan在这种情况下,当myNumber=47时,您可以使用索引-1
处的元素,而不是索引+1
(并检查索引>0
),我得到2,对于下一个最低的数字,它是未定义的。我如何使它,如果它是列表中的一个数字,它捕捉到下一个最接近的ie结果为45,下一个最低的结果也是4545@lakersfan如果数字不在列表中,索引将等于-1
。您可以检查if(index==-1)
并从list@lakersfan我在答案中添加了代码片段,以反映根据您的问题,当数字在列表中时的情况
var index = list.BinarySearch(myNumber);
if (index >= 0)
{
int nextNumber = list[index + 1];
Console.WriteLine("NextNumber: " + nextNumber);
int previousNumber = list[index - 1];
Console.WriteLine("PreviousNumber: " + previousNumber);
}
else
{
// Not found
var newIndex = ~index;
if (newIndex > list.Count - 1)
{
Console.WriteLine("myNumber wasn't found in list, myNumber is higher than any entry in list");
Console.WriteLine("NextNumber: " + int.MaxValue);
Console.WriteLine("PreviousNumber: " + list[newIndex - 1]);
}
else
{
Console.WriteLine("myNumber wasn't found in list, newIndex is the next higher number");
Console.WriteLine("NextNumber: " + list[newIndex]);
if (newIndex == 0)
{
Console.WriteLine("myNumber is lower than any entry in list");
Console.WriteLine("PreviousNumber: " + int.MinValue);
}
else
{
Console.WriteLine("PreviousNumber: " + list[newIndex - 1]);
}
}
}