簡體   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