2017-03-03 25 views
0

我跟着this关于lambda表达式的教程,并创建了下面的代码;c#linq 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>()) 

的功能,以取代那里的功能,但找不到合适的one.I可以很容易地添加其他Func键做isHighNumber相反但我想如果这FUNC是非常大的你不想完全重写它。我应该怎样在where方法中得到lambda Func的反义词?

回答

6

试试这个:

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

,除非你创建功能否定isHighNumber

0

我觉得你在这种情况下,唯一的选择就是实际调用函数

foreach (int x in intList.Where(x=>! isHighNUmber(x)).ToList<int>()) 
{ 
    Console.WriteLine(x); 
} 
您不能使用此语法糖
+0

“其实调用”?该方法在使用'Where(IsHighNumber)'时也被调用,它只是'Where(x => x.IsHighNumber(x))'的快捷方式。 – HimBromBeere

+0

也许明确调用是更好的描述 –

+0

@MiniverCheevy但你没有调用它。您正在创建一个主体调用它的新方法。 – Servy

-1

您应该更新您的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); 
} 
+1

's <10'不是's> 10的反义词',也许你的意思是<= 10'? – juharr

+0

@juharr:对。我的错。更新 :) – SpiderCode

0

你也可以使用Except但因为它可能会在序列重复两次,它不会被视为有效。

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