如何使用 LINQ 根据每个数组的第一个索引在数字数组列表中搜索数字

本文关键字:数字 数组 索引 何使用 列表 搜索 第一个 LINQ | 更新日期: 2023-09-27 18:33:36

我有一个数字数组列表。我正在搜索我的搜索号位于索引 0 中的数字之间的两个数组。然后从第二个数组返回位于索引 1 中的数字。(假设索引 0 中的数字已经排序并且没有重复项)

我对 LINQPad 的错误解决方案:

'found' 的值应该是 3,因为 9 在第二个和第三个数组中介于 4 和 10 之间。然后我获取第二个找到的数组并返回该数组的索引 1 中的 3。

List<int[]> list = new List<int[]> { new[] { 1, 5 }, new[] { 4, 6 }, new[] { 10, 3} , new[] { 15, 8} };
int searchFor = 9;
int found = list.Where(n => searchFor >= n[0] && searchFor <= n[0]).Select(i => i[1]).FirstOrDefault();
found.Dump(); //should be 3 instead of 0.

如何使用 LINQ 根据每个数组的第一个索引在数字数组列表中搜索数字

试试这个:

int found = list.Zip(list.Skip(1), (x, y) => x[0]<=searchFor&&y[0]>=searchFor?y[1]:0).FirstOrDefault(o=>o!=0);

好吧,我的逻辑有点不同,但得到你想要的结果。如果您正在做这样的键对值,我建议您只使用字典。在我看来,它使事情变得简单,如果您没有重复键,这应该可以正常工作。

 // Use dictionary instead of array's if just using two int values
 var dic = new Dictionary<int, int>();
 dic.Add(1, 5);
 dic.Add(4, 6);
 dic.Add(10, 3);
 dic.Add(15, 8);
 int searchFor = 9;
 // Don't need to find this really
 int low = (from l in dic
           where l.Key <= searchFor
           select l.Key).Max();
 // Just need this       
 int found = (from h in dic
             where h.Key >= searchFor
             select h.Value).Min();

 Console.WriteLine("Low: " + low);
 Console.WriteLine("Found: " + found);

怎么样

        var found = list.First(l => l[0] > searchFor)[1];

它应该可以解决问题,因为我可以假设list按每个第一个元素排序。

如果没有,那么

        var found = list.Orderby(l=>l[0]).First(l => l[0] > searchFor)[1];

也应该工作。

where

语句中的表达式筛选第一个元素小于或等于且大于或等于 9 的数组。由于它不能同时越来越少因此它实际上会过滤所有以 9 作为第一个元素的数组。对于给定的数据,这将导致一个空序列。因此,FirstOrDefault 返回默认值(整数为 0)。

您实际上必须查找大于或等于 9 的第一个元素:

int[] result = list.FirstOrDefault(arr => arr[0] >= searchFor);
if (result == null)
{
    Console.WriteLine("Not found!");
}
else
{
    Console.WriteLine(result[1]);
}