如何使用 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.
试试这个:
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]);
}