c# - 通过 LINQ 查找目标数字是否是数组中两个数字的总和

标签 c# linq arrays

基本的解决方案如下所示:

bool sortTest(int[] numbers, int target)
{
    Array.Sort(numbers);
    for(int i = 0; i < numbers.Length; i++)
    {
       for(int j = numbers.Length-1; j > i; j--)
       {
           if(numbers[i] + numbers[j] == target)
               return true;
       }
    }
    return false;
}

现在我对 LINQ 还很陌生,但这是我到目前为止所写的内容:

var result = from num in numbers
             where numbers.Contains(target -num)
             select num;
if (result.Count() > 0)
    return true;

return false;

现在我遇到了一个问题,给出了以下示例:
数组:1、2、4、5、8
目标:16

它应该返回 false,但它正在捕获 16-8=8。那么我该如何着手不让它在包含检查中注意到自己呢?或者我可以每次在不包含我正在使用的数字的查询中创建第二个数组(从而解决问题)吗?

提前致谢。

最佳答案

这是您要找的吗?

var result = from n1 in numbers
             from n2 in numbers
             where n1 != n2 && n1 + n2 == target
             select new { n1, n2 };

[编辑] 这将返回匹配两次并忽略数组中重复数字的情况。您无法使用表达式语法处理这些情况,因为您无法访问匹配项目的索引,但您可以这样做:

var result = numbers.Select((n1, idx) => 
    new {n1, n2 = numbers.Take(idx).FirstOrDefault(
    n2 => n1 + n2 == target)}).Where(pair => pair.n2 != 0);

只要你的数组中没有任何零。

[进一步思考编辑]

完美的混合解决方案:

var result = from item in numbers.Select((n1, idx) =>
                 new {n1, shortList = numbers.Take(idx)})
             from n2 in item.shortList
             where item.n1 + n2 == target
             select new {n1 = item.n1, n2};

关于c# - 通过 LINQ 查找目标数字是否是数组中两个数字的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2331882/

相关文章:

javascript - 转置 JavaScript 数组和对象

php - 在 PHP 中查找两个大数组之间差异的最佳方法

c# - 为Silverlight边框动态添加阴影效果?

javascript - 在没有页面刷新的情况下直接从 javascript 调用没有按钮单击的 asp.net 函数

c# - 从特定位置从 C# 中的字符串中提取值

xml - XLINQ : Remove certain XElements from a xml file which are saved in a LIst<XElement>

C# - 使用谓词选择属性

c# - 如何将其写入 linq to object 查询?

javascript - 如果只存在总宽度和一些坐标数组,则获取适当的 x 和宽度

javascript - Stripe 充电后重定向到新页面