0

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

我对 LINQPad 的错误解决方案:

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

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.
4

4 回答 4

1

试试这个 :

int found = list.Zip(list.Skip(1), (x, y) => x[0]<=searchFor&&y[0]>=searchFor?y[1]:0).FirstOrDefault(o=>o!=0);
于 2013-10-03T04:00:46.573 回答
1

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

 // 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);
于 2013-10-03T04:18:17.957 回答
1

怎么样

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

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

如果没有,那么

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

也应该工作。

于 2013-10-03T13:09:18.453 回答
0

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]);
}
于 2013-10-03T12:50:51.653 回答