簡體   English   中英

C#Linq查詢組,檢查結果是否為null

[英]C# Linq Query group by check if result is null

如果我有這樣的課程

public class Test
{
   public string Id {get; set;}
   public string Name {get; set;}
   public int Value {get; set;}
}

接着:

List<Test> values = new List<Test>(); // this contains let's say 10 items

我喜歡這個:

var grouped = values.Where(x=>x.Value > 10).GroupBy(x=>x.Name);

我的問題是如何檢查grouped == null 或者我如何檢查沒有符合該標准的分組?

我問,因為我喜歡這樣:

if (grouped == null) // this is false although the linq yielded no results
{

}

您可以使用方法Any()

var anyItems = grouped.Any();

您不需要檢查null,因為分組將返回空集合而不是null

您可以檢查是否沒有組,如下所示:

var anyGroups = grouped.Any();

如果至少有一個組,則名為Any的擴展方法將返回true 否則它將返回false

根據MSDN ,這是GroupBy方法的簽名:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector)

從上面可以清楚地看出,該方法返回實現IGrouping接口的一系列項。 IGrouping表示具有公共密鑰的對象的集合)。 查找序列是否包含元素的簡單方法是使用名為Any的枚舉擴展方法。

此外,這是一個O(1)操作 - 使用Any方法而不傳遞任何謂詞。 使用名為Count的枚舉擴展方法時,在某些情況下是O(n)操作。

GroupBy永遠不會返回null 當結果中沒有記錄時,您將獲得一個空的IEnumerable<IGrouping<TKey,TSource>>對象。

在您的情況下, GroupBy是不必要的:您可以用它替換它

var anyGreaterThanTen = values.Any(x=>x.Value > 10);

使用Any()就足夠了,但它不是最優的解決方案。

您顯然需要在找到結果后迭代結果,但在迭代結果之前調用Any()會導致查詢運行兩次。 對於像這里一樣的簡單示例,這不是什么大問題,但如果它是對數據庫(LINQ to SQL或Entity Framework)的查詢,那么您有兩個數據庫命中。 一旦檢查是否有任何結果,然后在下一步獲取結果。

為避免這種情況,您可以寫:

bool hasResult = false;
// iterating over the result, and performing your task
foreach(var group in grouped)
{
    hasResult = true;

    // process data
    // ...
}

if(!hasResult)
{
    // ...
}

檢查結果是否為null時,我遇到同樣的問題。 所以,我調試了它。 我發現當結果沒有組時,它有時沒有元素或1個元素,但是這個元素是null。 因此,要檢查結果不為null的位置,我們應該結合以下兩個條件:

if(grouped.Count() > 0 && grouped.ElementAt(0) != null)
    {
       //TODO:....enter code here
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM