繁体   English   中英

时间:2019-01-16标签:c#linqlambda

[英]c# linq lambda where not

我遵循了有关lambda表达式的教程,并创建了以下代码;

Func<int, bool> isHighNUmber = s => s > 10;
IList<int> intList = new List<int>() { 1, 3,9, 2, 63, 236, 32, 474, 83, 832, 58, 3458, 35, 8, 4 };

Console.WriteLine("All numbers.");
foreach (int x in intList)
{
    Console.WriteLine(x);
}
Console.WriteLine("High Numbers");
foreach(int x in intList.Where(isHighNUmber).ToList<int>())
{
    Console.WriteLine(x);
}

而且效果很好,现在我想尝试仅获取低数字,所以我尝试了

foreach(int x in intList.Where(!isHighNUmber).ToList<int>())

foreach(int x in intList.Where(isHighNUmber == false).ToList<int>())

以及上述语法的变体,但无法使其正常工作。 我还寻找了类似WhereNot的函数

foreach(int x in intList.WhereNot(!isHighNUmber).ToList<int>())

替换where函数,但是找不到合适的函数。我可以轻松地添加另一个Func来实现isHighNumber的相反功能,但是我想如果那个func非常大,则您不想完全重写它。 我应该如何在where方法中获得lambda Func的反面?

尝试这个:

  foreach(int x in intList.Where(x=> !isHighNUmber(x)).ToList<int>())

除非您创建否定isHighNumber isNotHighNumber函数,否则不能使用此语法糖

我认为在这种情况下,您唯一的选择是实际调用该函数

foreach (int x in intList.Where(x=>! isHighNUmber(x)).ToList<int>())
{
     Console.WriteLine(x);
}

您也可以使用Except但是效率不高,因为它可能会在序列上迭代两次。

Console.WriteLine("Low Numbers");
foreach (int x in intList.Except(intList.Where(isHighNUmber)).ToList<int>())
{
    Console.WriteLine(x);
}

您应该如下所示更新Func

Func<int, bool, bool> isHighNUmber = (s, isGreaterCheck) => { return isGreaterCheck ? s > 10 :  s <= 10 ;};

然后如下所述编写foreach

Console.WriteLine("Low Numbers");
foreach(int x in intList.Where(x => isHighNUmber(x, false)).ToList<int>())
{
    Console.WriteLine(x);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM