Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检索列表中下一个较高的数字?_C#_List_Linq - Fatal编程技术网

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]);
        }
    }
}